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懒加载,无论是否维护关系一方;
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懒加载,无论是否维护关系一方;