天天看点

JPA学习笔记 - 关联关系

OneToMany: 指定 1对多 的映射关系(可通过fetch的属性设置加载方式)

JoinColmn: 指定外键的列名(外键存在于 多 的一方表中)

单向 n-1 : 

先保存n的一端时,会多出update语句,因为插入n端时并未知道外键的值,插入1的一端后update外键;

先保存1的一端时,没有update语句;

默认对关联的一方使用EAGER急加载;

单向 1-n :

保存时一定会多出update语句,因为n的一端插入时不会同时插入外键;

删除 1 的一端,先把 n 的一端外键set null,再删除(可通过OneToMany.cascade修改级联)

默认对关联的一方使用LAZY懒加载; 

双向 1-n :

分别为两个对象的指定映射关系,就开启了双向。注意的是外键名必须一致

双向 1-n :保存时:

先保存 1 的一端,会多出N条update语句(1端维护关联关系时发出的);

先保存 n 的一端时,再保存 1 的一端,会出现2*N条update语句(1和n端各update一次),因为 1 的一端未保存,并未知道外键是多少;

在双向 1-n 中,建议使用 n 的一方维护关联关系,而 1 的一方不维护关联关系,这样会有效减少sql语句,提升性能。不维护关联关系:设置 1 的一端@OneToMany的mappedBy;如:mappedBy="user" 表示由 n 的一方的user属性维护;

注意:若 1 的一端使用了mappedBy属性,1的一端就不能使用@JoinColumn

双向 1-1:

建议先保存不维护关联关系的一方,会减少sql。

建议不修改不维护关联关系一方的fetch属性。(因为延迟加载也是使用联表查询,且会发出2条sql,一条查一个对象)

默认EAGER急加载;

若查询双方的其中一方,会通过左外连接一并获取关联的另一方对象;(可通过fetch属性改变加载策略)

双向 n-n :

默认LAZY懒加载,无论是否维护关系一方;

继续阅读