文章目录
一、Inverse属性
参考:https://mp.weixin.qq.com/s/2bLP_tHzWathOvx45AMCxQ
1.1 含义
inverse:反转。表示控制权是否转移。
属性值 | 含义 |
---|---|
true | 控制权已转移【当前一方没有控制权】 |
false | 控制权没有转移【当前一方有控制权】。为默认值。 |
起作用时间:在维护关联关系的时候起作用的。
设置位置:只能在“一”的一方中使用该属性!
项目 | inverse=false | inverse=ture |
---|---|---|
含义 | 有控制权 | 没有控制权 |
保存关联信息时 | 可以保存相对应的关联数据 | 数据会保存,但关联关系没有维护,即外键列为NULL |
查询数据时 | 没有任何影响 | 没有任何影响 |
解除关联关系时 | 可以解除关联关系 | 不能解除关联关系,不会生成update语句,也不会报错 |
在删除数据时对关联关系的影响 | 将外键的值设置为NULL,随后删除数据 | 若删除的记录有被外键引用,会报错,违反主外键引用约束。反之,可以直接删除。 |
多对多关系时,同上,多对多的关联关系是在中间表中。
1.2 保存数据时
需求:部门没有控制权(维护关联关系的权限)
dept.hbm.xml
<!--维护关系的是Set集合,对应employee表-->
<set cascade="save-update" name="set" table="employee" inverse="true">
结果:在保存部门和员工, 数据会保存。但关联关系不会维护,即员工表外键字段(dept_no)为NULL。
1.3 查询数据
需求:部门没有控制权(维护关联关系的权限)。
Dept de = (Dept) session.get(Dept.class, 1);
System.out.println(de.getSet());
结果:没有影响。
1.4 解除关联关系
1.4.1 部门有控制权时
dept.hbm.xml
<set cascade="save-update" name="set" table="employee">
Dept de = (Dept) session.get(Dept.class, 1);
//清除关联信息
de.getSet().clear();
结果:可以解除关联关系,employee的外键字段(dept_no)被设置为NULL了。
1.4.2 部门没有控制权时
dept.hbm.xml
<set cascade="save-update" name="set" table="employee" inverse="true">
Dept de = (Dept) session.get(Dept.class, 2);
//清除关联信息
de.getSet().clear();
结果:不能解除关联关系,employee的外键字段(dept_no)没有改变。
1.5 删除数据时
1.5.1 部门有控制权时
dept.hbm.xml
<set cascade="save-update" name="set" table="employee">
Dept de = (Dept) session.get(Dept.class, 1);
//删除部门1
session.delete(de);
结果:当有控制权的时候可以删除数据,先把外键设置为NULL,再删除数据!
1.5.2 部门没有控制权时
dept.hbm.xml
<set cascade="save-update" name="set" table="employee" inverse="true">
Dept de = (Dept) session.get(Dept.class, 2);
//删除部门2
session.delete(de);
结果:直接抛出异常,该部门拥有外键,不能删除数据!
二、cascade属性
2.1 含义
cascade:级联。操作某一属性时,对其他关联字段的影响。
设置位置:可以在“一”的一方,也可以在“多”的一方设置。
属性值 | 含义 |
---|---|
none | 不级联操作, 默认值 |
save-update | 级联保存或更新 |
delete | 级联删除 |
save-update,delete | 级联保存、更新、删除 |
all | 级联保存、更新、删除 |
2.2 级联保存
需求:保存部门对象时,自动保存员工对象。
dept.hbm.xml
<set cascade="save-update" name="set" table="employee">
//创建部门对象
Dept dept = new Dept("开发部");
//创建雇员对象
Employee zs = new Employee("张珊",1111);
Employee ls = new Employee("李四",2222);
// 维护关系
dept.getSet().add(zs);
dept.getSet().add(ls);
//保存dept对象
session.save(dept);
是否设置级联保存 | 结果 |
---|---|
否 | 若只保存一个对象,而对象又存在外键时,则抛出异常。 |
是 | 若只保存一个对象,可以将对象以及有关联关系的对象一并保存。 |
2.3 级联删除
一般情况下,不推荐。
需求:删除部门对象时,自动删除员工对象。
dept.hbm.xml
<set cascade="save-update,delete" name="set" table="employee">
//删除部门为3的记录
Dept dept1 = (Dept) session.get(dept.getClass(), 3);
session.delete(dept1);
是否设置级联删除 | 结果 |
---|---|
否 | 在删除数据时,会把外键的字段设置为NULL,再删除当前一方的记录。 |
是 | 在删除数据时,把对象有关联关系的记录都删除了。 |
2.4 cascade和inverse同时使用
dept.hbm.xml
<set cascade="save-update,delete" name="set" table="employee" inverse="true">
inverse的优先级是比cascade的优先级要高的,因此设置了inverse属性为true,那么cascade就无效了。