文章目錄
一、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就無效了。