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则不需要添加表字段。


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


总结,作为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 级联关系
实际业务中,我们通常会遇到以下情况:
- 用户和用户的收货地址是一对多关系,当用户被删除时,这个用户的所有收货地址也应该一并删除。
- 订单和订单中的商品也是一对多关系,但订单被删除时,订单所关联的商品肯定不能被删除。
此时只要配置正确的级联关系,就能达到想要的效果。
级联关系类型:
- CascadeType.REFRESH:级联刷新,当多个用户同时作操作一个实体,为了用户取到的数据是实时的,在用实体中的数据之前就可以调用一下refresh()方法
- CascadeType.REMOVE:级联删除,当调用remove()方法删除Order实体时会先级联删除OrderItem的相关数据
- CascadeType.MERGE:级联更新,当调用了Merge()方法,如果Order中的数据改变了会相应的更新OrderItem中的数据
- CascadeType.ALL:包含以上所有级联属性
- CascadeType.PERSIST:级联保存,当调用了Persist() 方法,会级联保存相应的数据
需要注意的是,CascadeType.ALL要谨慎使用,为了达到数据同步,很多人喜欢用CascadeType.ALL来实现。但上面订单和商品的例子就不适用。
spring jpa ManyToMany 理解和使用的更多相关文章
- 使用Spring JPA中Page、Pageable接口和Sort类完成分页排序
显示时,有三个参数,前两个必填,第几页,一页多少个size,第三个参数默认可以不填. 但是发现这个方法已经过时了,通过查看它的源码发现,新方法为静态方法PageRequest of(page,size ...
- 沉淀再出发:Spring的架构理解
沉淀再出发:Spring的架构理解 一.前言 在Spring之前使用的EJB框架太庞大和重量级了,开发成本很高,由此spring应运而生.关于Spring,学过java的人基本上都会慢慢接触到,并且在 ...
- Spring JPA事务
目录 1. 概述 促进阅读: 2. 配置不带XML的事务 3. 使用XML配置事务 4. @Transactional 注解 5. 潜在的陷阱 5.1. 事务和代理 5.2. 更改隔离级别 5.3. ...
- 谈谈对Spring IOC的理解(转)
学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...
- 谈谈对Spring IOC的理解
学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...
- Spring系列之谈谈对Spring IOC的理解
学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IOC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...
- spring jpa 实体互相引用返回restful数据循环引用报错的问题
spring jpa 实体互相引用返回restful数据循环引用报错的问题 Java实体里两个对象有关联关系,互相引用,比如,在一对多的关联关系里 Problem对象,引用了标签列表ProblemLa ...
- 谈谈对Spring IOC的理解【转】
学习过Spring框架的人 一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大 ...
- Spring IOC的理解
学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理 ...
随机推荐
- 把ngnix注册为linux服务 将Nginx设置为linux下的服务
一.创建服务脚本 vim /etc/init.d/nginx 脚本内容如下 #! /bin/sh # chkconfig: - 85 15 PATH=/web/server/nginx/sbin DE ...
- 工具类BitMap 把网络URL图片转换成BitMap
代码不复杂,直接把完整代码贴上. 这次是用到很旧的HttpURLConnection,那为什麽会用这个,因为我本来想转回okhttp的,可实在没时间转,项目就已经做下去了,结果转不回来. packag ...
- JavaScript之Date常用知识点
1.new Date(dateStr) :把字符串转换为Date对象 参数: ①dateStr {string} :可转换为Date对象的字符串(可省略时间):字符串的格式主要有两种: 1) yyyy ...
- 数据结构与算法——认识O(NlogN)的排序(1)
归并排序 1) 整体就是一个简单递归,左边排好序.右边排好序.让其整体有序 2) 让其整体有序的过程里用了外排序方法 3) 利用master公式来求解时间复杂度 4) 归并排序的实质 时间复杂度0(N ...
- 2019-2020-1 20199324《Linux内核原理与分析》第八周作业
第七章 可执行程序工作原理 一.ELF目标文件格式 目标文件:ABI,应用程序二进制接口,是编译器生成的文件. ELF:可执行的和可链接的格式,是一个目标文件格式的标准.三种类型是: 可重定位文件:L ...
- 微信中的APP、公众号、小程序的openid及unionid介绍
微信中的APP.公众号.小程序的openid及unionid介绍 1.unionid 如果开发者拥有多个移动应用.网站应用.和公众帐号(包括小程序),可通过 UnionID 来区分用户的唯一性,因为只 ...
- 视觉SLAM算法框架解析(3) SVO
版权声明:本文为博主原创文章,未经博主允许不得转载. SVO(Semi-direct Visual Odometry)[1]顾名思义是一套视觉里程计(VO)算法.相比于ORB-SLAM,它省去了回环检 ...
- codeigniter注意点
1. 数据的操作: insert 和update最好使用自带的db方法,1避免了过滤字符串和sql注入,2是数据量相对查询是非常小的. select则建议使用自己写的,这样便于优化. 2. 去掉ind ...
- SpringBoot连接Oracle报错,找不到驱动类,application.properties文件中驱动类路径为红色
pom.xml文件: <!-- oracle odbc --> <dependency> <groupId>com.oracle</groupId> & ...
- 蒲公英Ghost Win 7 Sp1(x86/x64)旗舰版 201910
蒲公英Ghost Win 7 Sp1(x86/x64)旗舰版 201910 <ignore_js_op> <ignore_js_op> <ignore_js_op> ...