温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

spring jpa中ManyToMany的原理是什么

发布时间:2021-05-12 16:52:32 来源:亿速云 阅读:312 作者:Leah 栏目:编程语言

本篇文章为大家展示了spring jpa中ManyToMany的原理是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

1.java和jpa 中所有的关系都是单向的。这个关系数据库不同,关系数据库,通过外键定义并查询,使得反向查询总是存在的。

2.JPA还定义了一个OneToMany关系,它与ManyToMany关系类似,但反向关系(如果已定义)是ManyToOne关系。

OneToMany与JPA中ManyToMany关系的主要区别在于,ManyToMany总是使用中间关系连接表来存储关系,

OneToMany可以使用连接表或者目标对象的表引用中的外键源对象表的主键。

@OneToMany(cascade = CascadeType.ALL)
  @JoinColumn(name = "OPR_WARE_SYSCONFIG_ID",foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
  private List<WarehouseVO> warehouse;

wareHouseVO的表通过外键字段关联,而定义了OneToMany的属性的VO则不需要添加表字段。

spring jpa中ManyToMany的原理是什么

spring jpa中ManyToMany的原理是什么

ManyToOne:

@ManyToOne
  @JoinColumn(name = "OPR_WAREHOUSE_ENV_ID")
  private EnvironmentVO env ;

spring jpa中ManyToMany的原理是什么

spring jpa中ManyToMany的原理是什么

总结,作为many的一方需要有外键关联One的一方。

@ManyToMany 注解

manyToMany需要和@JoinTable表结合使用,ManyToMany总是使用中间关系连接表来存储关系。如果两个Vo都定义了ManyToMany的话,因为单向关系,会生成有2个中间表。所以需要改造成双向关系,使其只存在一个中间表。

例子:

a:一方不需要mappedBy属性,一方需要。

@ManyToMany
  @JoinTable(name = "AUTO_SYSTEM", joinColumns = { @JoinColumn(name = "OPR_AUTO_ID") }, inverseJoinColumns = {
      @JoinColumn(name = "OPR_SYSTEM_ID") }, foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT), inverseForeignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
  private List<SystemVO> systems;
@ManyToMany(mappedBy = "students")
private List<Service> services;

b:

@Entity
public class Student {
  @Id
  private String id;
  @ManyToMany
  @JoinTable
  private List<Teacher> teachers;
}
 
@Entity
public class Teacher {
  @Id
  private String id;
  @ManyToMany
  @JoinTable
  private List<Student> students;
}

@ManyToMany即表示了老师和学生的多对多关系。@ManyToMany注解可以用在字段或方法上

但是这样会有两个表出现,TEACHER_STUDENTS表和STUDENT_TEACHERS。

原因是这里的多对多关系正是维基百科提到的单向原则。老师和学生虽然分别定义了自己的多对多关系,但这个关系都是单向的,要使关系成为双向。

mappedBy 属性

mappedBy是OneToOne、OneToMany和ManyToMany这三种关联关系的属性。

用来标注拥有这种关系的字段。 除非关系是单向的,否则是必需的。

什么叫拥有关联关系呢,假设是双向一对一的话,那么拥有关系的这一方有建立、解除和更新与另一方关系的能力。而另一方没有,只能被动管理。

由于JoinTable和JoinColumn一般定义在拥有关系的这一端,而mappedBy一定是定义在关系的被拥有方(the owned side),也就是跟定义JoinTable

和JoinColumn互斥的一方,它的值指向拥有方中关于被拥有方的字段,可能是一个对象(OneToMany),也可能是一个对象集合(ManyToMany)。

@Entity
public class Student {
  @Id
  private String id;
  @ManyToMany(mappedBy = "students")
  private List<Teacher> teachers;
}
 
@Entity
public class Teacher {
  @Id
  private String id;
  @ManyToMany
  @JoinTable(“student”)
  private List<Student> students;
}

这时中间表只有一张TEACHER_STUDENTS,关联关系也变成了我们想要的双向关系。

Cascade 级联关系

实际业务中,我们通常会遇到以下情况:

1.用户和用户的收货地址是一对多关系,当用户被删除时,这个用户的所有收货地址也应该一并删除。

2.订单和订单中的商品也是一对多关系,但订单被删除时,订单所关联的商品肯定不能被删除。

此时只要配置正确的级联关系,就能达到想要的效果。

级联关系类型:

  • CascadeType.REFRESH:级联刷新,当多个用户同时作操作一个实体,为了用户取到的数据是实时的,在用实体中的数据之前就可以调用一下refresh()方法

  • CascadeType.REMOVE:级联删除,当调用remove()方法删除Order实体时会先级联删除OrderItem的相关数据

  • CascadeType.MERGE:级联更新,当调用了Merge()方法,如果Order中的数据改变了会相应的更新OrderItem中的数据

  • CascadeType.ALL:包含以上所有级联属性

  • CascadeType.PERSIST:级联保存,当调用了Persist() 方法,会级联保存相应的数据

上述内容就是spring jpa中ManyToMany的原理是什么,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI