JPA加强(关联关系配置)
作者:互联网
- 单向一对多
单向一对多用得比较少(性能差),发送的SQL比单向多对一要多,但是依然要求必须掌握,因为我们在使用双向一对多还会用到单向一对多的相应配置。
@OneToMany
// 必须配置外键id,否则会多生成一张表,形成多对多的关系
@JoinColumn(name = "dir_id")
// 建议实例化,用的时候不需要在实例化,这里和单向多对一要求不同
private Set<Product> products = new HashSet<Product>();
这个Set不能是HashSet
- 单向多对一
@ManyToOne
@JoinColumn(name=”dir_id”)
private Product product;
注意:这里的一方不能实例化,这里new出来的一方对象相当于是新建的对象,没有主键,无法关联关系
无论是一对多还是多对一,建立关联关系的时候都是由包含外键的实体调用set方法来建立关联关系
单向一对多和单向多对一持久化时发送SQL的区别
单向一对多:无论是先持久化多方还是一方,除了会发送new出来的对象的SQL外,还会调用多方对象发送update的SQL
单向多对一:如果是先持久化一方再持久化多方,只会发送new出来的对象的SQL;如果是先持久化多方在持久化一方,除了会发送new出来的对象的SQL外,还会调用多方对象发送update的SQL
一对多要比多对一多发送SQL,所以在性能方面,多对一性能较高
- 延迟加载
a) 当我们查询一对多的一方数据的时候,因为@OneToMany是延迟加载,所以不会发送SQL语句查询多方的数据,所以这时我们就需要改变一方关联关系的抓取策略
@OneToMany(fetch=FetchType. EAGER)
b) 判断集合是否有值,就判断他的size是否为0来判断
- 集合映射
a) 集合延迟加载类
b)
声明集合的时候必须使用接口
因为Hibernate在创建了集合对象后是使用了它的的集合类PersistentSet来接收数据的(而不是我们写的那个HashSet)。如果我们使用接口声明(如Set),那么它的集合类PersistentSet也是实现了这个接 口。所以它可以把这个类赋给Set。 但是我们使用HashSet,它们关系是平级的,不能进行转换,所以就出现错误了。
c) 集合映射的JAVA类型
常用的有2种:
java.util.Set对应PersistentSet
java.util.List对应PersistentBag
Set:不能重复,集合里面的元素没有顺序
List:可以重复,集合里面的元素有顺序,list默认是按照保存顺序排序,要对其他进行排序就用这个注解@OrderBy("price
DESC")进行一个排序
如何选择:怎么选择使用哪一种呢:看数据是否会重复,是否需要顺序
set一般用在多对多,也有一对多
list一般只是用在组合关系(什么模型才是组合关系,需要自己分析,这个是需要经验的)
- 双向多对一,双向一对多
a)
配置
在多方字段上面打上@OneToMany( mappedBy = "dir")
// mappedBy = "dir"表示一方的关系参照多方实体属性来管理
在一方字段上按照原来的方式配置@ManyToOne(name=”dir_id”)
- 单向多对多
a) 在一个实体配置@manytomany
b)
inverseJoinColumns
= @JoinColumn (name = "teacher_id" ),//被维护端外键
JoinColumns = @JoinColumn (name = "student_id" )//维护端外键
- 双向多对多
a)
两个实体类都要配置
@manytomany, @JoinTable(name = "t_role_user",joinColumns = {@JoinColumn(name = "role_id")},inverseJoinColumns= {
@JoinColumn(name = "user_id") })
- 级联保存(相当于是特殊的多对多)
a) 定义:只用持久化一方的数据就会把多方数据保存到数据库,本质就是只调用一次persistence方法来保存一方。
b) @ManyToMany(cascade = CascadeType.PERSIST) cascade = CascadeType.PERSIST属性表示该保存方式是一个级联保存,可以在其中一个实体类上加该注解也可以在多个实体类上加该注 解,在保存数据的时候只用保存一个实体对象的数据就行了。
- 双向一对一
a) 关联外键方式:@OneToOne @JoinColumn(name = "qq_id", unique = true) unique = true确表是一对一的关系,@OneToOne(optional = false) optional表示该字段能否为空
b) 共享主键
标签:JoinColumn,name,JPA,配置,单向,关联,SQL,一方,id 来源: https://www.cnblogs.com/8888-lhb/p/11244164.html