概念

映射

数据库中,表之间存在一对一、一对多、多对多关联关系,相应的,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
2
3
4
<set name="Set变量">
    <key column="外键名"></key>
    <one-to-many class="多方的对象类"/>
</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
  1. 孤儿结点:该记录不再与任何外键相关联

控制反转

一般只在一方设置,以优化插入

配置

添加inverse,值为true或false,true表示将级联交给对方,此时一方的cascade将无效

1
<set name = "Set变量" inverse="true">