Hibernate——inverse和cascade屬性

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章