关系映射
概念
映射
数据库中,表之间存在一对一、一对多、多对多关联关系,相应的,hibernate中也存在这些关联关系,称之为映射
单向关联
在一的一方,可以使用Set、List、Map、Bag等类型存储与多的一方的关联对象,并支持级联(cascade)。
此时,一的一方知道多方的存在,而多方不知道一方,则是单向关联
双向关联
如果,多方也存有一方的对象,则是双向关联
控制反转
https://www.cnblogs.com/whgk/p/6135591.html
当在多方插入数据时,会先插入内部的一方数据,再插入自己
当在一方插入数据时,也会向插入内部的多方数据,在插入自己,再更新多方数据的主键
所以一般在一方设置控制反转,当在一方使用保存时,调用多方的保存方法
即,使用多方的级联,一方的级联失效
一对多
Set
说明
Set是不重复的无序的集合,是数据库集合中最常用的一种(数据库中的记录一般是无序的,不重复的)。
Set在多方声明,用于保存于本记录关联的多方记录
声明
var必须声明为Set接口,不得使用具体类型
并设置其getter、setter
1 | private Set<多方类型> var = new HashSet<多方类型> |
配置
1 | <set name="Set变量"> |
其他
此时,一方保存了对应的多方数据,是一对多的单向映射
多对一
说明
一对多没有涉及到多条记录,只需要添加一个一方的对象类型即可
声明
并设置其getter、setter
1 | private 一方类型 var = new 一方类型(); |
配置
1 | <many-to-one name="一方类型变量" column="外键名" class="一方的对象类"></many-to-one> |
其他
此时,多方保存有一方的数据,是多对一单向映射
双向映射
指多方和一方均添加了映射关系
级联
在一对多的关系中,需要先保存关联的内部对象,再保存自己,或删除时需依次删除
使用级联后,保存自己时,将自动保存关联的内部对象
配置
在对应的set配置(一方)或many-to-one(多方)添加属性cascade=”值”
1 | <set name = "Set变量" cascade="save-update"> |
取值
| 值 | 说明 |
|---|---|
| none | 默认值,不级联 |
| save-update | 级联更新、插入 |
| delete | 级联删除 |
| delete-orphan | 级联删除,但只删除孤儿结点_1 |
| all-delete-orphan |
- 孤儿结点:该记录不再与任何外键相关联
控制反转
一般只在一方设置,以优化插入
配置
添加inverse,值为true或false,true表示将级联交给对方,此时一方的cascade将无效
1 | <set name = "Set变量" inverse="true"> |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 AlMirai!