Hibernate——inverse和cascade属性

一、Inverse属性

参考:https://mp.weixin.qq.com/s/2bLP_tHzWathOvx45AMCxQ

1.1 含义

inverse:反转。表示控制权是否转移。

属性值含义
true控制权已转移【当前一方没有控制权】
false控制权没有转移【当前一方有控制权】。为默认值。

起作用时间:在维护关联关系的时候起作用的。
设置位置:只能在“一”的一方中使用该属性!

项目inverse=falseinverse=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就无效了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值