Hibernate的关系映射(一对多和多对多)

原文链接: https://my.oschina.net/u/3392125/blog/872244

 

一对多:

1. 创建实体( 

在一的一方中放入多的一方的集合 

在多的一方中放入一的一方的对象 

2. 创建映射文件 

在多的一方配置: many-to-one标签: 

 name属性:一的一方 在多的一方的属性名称 

 class属性:全限定名 

 column属性:外键名称 

 

 在一的一方配置 set标签: 

 name属性:多的一方 在一的一方的属性名称 

 key标签: column属性:外键名称 

 one-to-many标签: class属性:全限定名 

 注意: 不要忘记在核心配置文件中加载映射文件 

 3. 测试

 

一对多级联:

级联:   对主体进行操作的时候,对其关联的对象也进行相同的操作. 

 注意:级联具有方向性 

 级联保存和更新:

 保存一的一方的同时保存多的一方: 在一的一方的映射文件中配置级联保存更新.set标签上配置 cascade="save-update" 

 保存多的一方的同时保存其关联的主体: 多的一方的映射文件中配置级联保存更新.many-to-one标签上配 置 cascade="save-update" 

 

 级联删除:

 默认删除:先将多表中的相应的记录的外键设置为null,删除一表中的记录. 

 删除一方的同时,删除其关联的多方: 一方是主体.须在在一方的映射文件中配置级联删除 set标签上配置 cascade="delete" 或者cascade="save-update,delete" 

 删除多方的同时,删除其关联的一方: 多方是主体,需要在多方的映射文件中配置级联删除 many-to-one标 签上配置 cascade="delete" 

 

 对象导航(关联的含义):比如查找到一的一方的一个对象,从该对象的属性(集合)中取出多的一方的数据

 

 冗余sql(多余sql) 解决方案: 

 方案1:单向关联 即只对一方操作,另一方通过级联的方式被动更新

 方案2:配置(让一方放弃外键维护权:一的一方) 在一的一方 set 标签上配置 inverse="true" 

 cascade:操作主体的时候是否对关联对象执行相同的操作; inverse:多表中是否有外键

 

 

多对多:

1. 创建实体 放入对方的集合 

2. 创建映射文件 在角色中的配置 

双方配置set标签

name属性:本类的类名

table属性:对应第三个中间表的表名

(被动方):配置inverse="true";

子标签key:

column:中间表的外键名称

子标签many-to-many:

class属性:另一方的类的全限定名

column属性:对方的主键的外键名称

3. 编写测试

 

注意:保存的时候出问题 

方案1:单向关联 

方案2:让其中的一方放弃外键维护权 (开发中,让被动方放弃.),对应的映射文件中set标签上配置 inverse="true"

 

多对多级联:

级联保存:保存主动方的同时,也保存被动方的数据

 在主动方的映射文件中配置 cascade="save-update" 

 

级联删除: 

默认删除: 先删除中间表中相应的记录,然后再删除对应表的记录 

级联删除: 删除主动方的同时,删除被动方 映射文件中配置 cascade="delete"

 

其他操作:

比如为一方添加多方实体的功能:在一方对象的属性(集合)中追加多方的一个实体即可

 

转载于:https://my.oschina.net/u/3392125/blog/872244

你可能感兴趣的:(Hibernate的关系映射(一对多和多对多))