Hibernate——inverse和cascade属性

文章目录

  • 一、Inverse属性
    • 1.1 含义
    • 1.2 保存数据时
    • 1.3 查询数据
    • 1.4 解除关联关系
      • 1.4.1 部门有控制权时
      • 1.4.2 部门没有控制权时
    • 1.5 删除数据时
      • 1.5.1 部门有控制权时
      • 1.5.2 部门没有控制权时
  • 二、cascade属性
    • 2.1 含义
    • 2.2 级联保存
    • 2.3 级联删除
    • 2.4 cascade和inverse同时使用

一、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  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就无效了。

你可能感兴趣的:(SSH)