hibernate mysql cascade_Hibernate第五篇【inverse、cascade属性详解】
前言
上一篇博文已經(jīng)講解了一對多和多對一之間的關(guān)系了,一對多和多對一存在著關(guān)聯(lián)關(guān)系(外鍵與主鍵的關(guān)系)。本博文主要講解Inverse屬性、cascade屬性。這兩個屬性對關(guān)聯(lián)關(guān)系都有影響
Inverse屬性
Inverse屬性:表示控制權(quán)是否轉(zhuǎn)移..
true:控制權(quán)已轉(zhuǎn)移【當(dāng)前一方?jīng)]有控制權(quán)】
false:控制權(quán)沒有轉(zhuǎn)移【當(dāng)前一方有控制權(quán)】
Inverse屬性,是在維護(hù)關(guān)聯(lián)關(guān)系的時候起作用的。只能在“一”的一方中使用該屬性!Inverse屬性的默認(rèn)值為fasle,也就是當(dāng)前一方是有控制權(quán)的
從一下的幾個方面看看Inverse在維護(hù)關(guān)聯(lián)關(guān)系時是否起作用:
保存數(shù)據(jù)
獲取數(shù)據(jù)
解除關(guān)聯(lián)關(guān)系
刪除數(shù)據(jù)對關(guān)聯(lián)關(guān)系的影響
保存數(shù)據(jù)
將inverse屬性設(shè)置為ture,使dept沒有控制權(quán)
執(zhí)行保存數(shù)據(jù)操作時,發(fā)現(xiàn)Hibernate只執(zhí)行了三條SQL語句。employee表的外鍵并沒有數(shù)據(jù)
結(jié)論:如果設(shè)置控制反轉(zhuǎn),即inverse=true, 然后通過部門方維護(hù)關(guān)聯(lián)關(guān)系。在保存部門的時候,同時保存員工, 數(shù)據(jù)會保存,但關(guān)聯(lián)關(guān)系不會維護(hù)。即外鍵字段為NULL
查詢數(shù)據(jù)
設(shè)置inverse屬性為true,那么部門一方是沒有控制權(quán)的。
我們在查看數(shù)據(jù)的時候,發(fā)現(xiàn)inverse屬性對查詢數(shù)據(jù)是沒有影響的
//查詢出Dept對象
Dept de = (Dept) session.get(Dept.class, 1);
System.out.println(dept.getDeptName());
System.out.println("-----------");
//用到的時候再查詢數(shù)據(jù)庫,Hibernate的懶加載【后面會講解】
System.out.println(de.getSet());
解除關(guān)聯(lián)關(guān)系
部門和員工是存在外鍵的聯(lián)系的,我們接下來看看inverse屬性對于解除關(guān)聯(lián)關(guān)系有沒有影響
當(dāng)部門一方有權(quán)限時,即inverse屬性為false
//查找部門id為1的信息
Dept dept1 = (Dept) session.get(Dept.class, 1);
//清除關(guān)聯(lián)信息
dept1.getSet().clear();
可以解除關(guān)聯(lián)關(guān)系,employee的外鍵字段被設(shè)置為NULL了
當(dāng)部門一方?jīng)]有權(quán)限時,即inverse屬性為true
//查找部門id為2的信息
Dept dept1 = (Dept) session.get(Dept.class, 2);
//清除關(guān)聯(lián)信息
dept1.getSet().clear();
不能解除關(guān)聯(lián)關(guān)系
刪除數(shù)據(jù)對關(guān)聯(lián)關(guān)系的影響
當(dāng)部門一方有權(quán)限時,即inverse屬性為false
//查找部門id為2的信息
Dept dept1 = (Dept) session.get(Dept.class, 2);
//刪除部門2
session.delete(dept1);
當(dāng)有控制權(quán)的時候可以刪除數(shù)據(jù),先把外鍵設(shè)置為NULL,再刪除數(shù)據(jù)!
當(dāng)部門一方?jīng)]有權(quán)限時,即inverse屬性為true
//查找部門id為1的信息
Dept dept1 = (Dept) session.get(Dept.class, 1);
//刪除部門1
session.delete(dept1);
直接拋出異常,說該部門擁有外鍵,不能刪除數(shù)據(jù)!
cascade屬性
cascade表示級聯(lián)的意思,簡單來說就是操作某一屬性時,對其他關(guān)聯(lián)字段的影響
casecade屬性不像inverse屬性只能在“一”的一方設(shè)置,它可以在“一”的一方也可以在“多”的一方設(shè)置
cascade有這么幾個值
none 不級聯(lián)操作, 默認(rèn)值
save-update 級聯(lián)保存或更新
delete 級聯(lián)刪除
save-update,delete 級聯(lián)保存、更新、刪除
all 同上。級聯(lián)保存、更新、刪除
級聯(lián)保存
級聯(lián)保存有什么用呢???我們來看個例子:
如果在保存對象的時候,沒有把相關(guān)的對象也一并保存進(jìn)數(shù)據(jù)庫,會出現(xiàn)錯誤。
因?yàn)樗鼤l(fā)現(xiàn)dept是有外鍵的,而外鍵又是一個對象來保存著,這個對象在數(shù)據(jù)庫表中并沒有存在,因此會拋出異常
//創(chuàng)建對象
Dept dept = new Dept();
dept.setDeptName("開發(fā)部");
Employee zs = new Employee();
zs.setEmpName("張珊");
zs.setSalary(1111);
Employee ls = new Employee();
ls.setEmpName("李四");
ls.setSalary(2222);
//維護(hù)關(guān)系
dept.getSet().add(zs);
dept.getSet().add(ls);
//保存dept對象
session.save(dept);
如果我們在dept中設(shè)置了級聯(lián)保存,那么Hibernate就會知道:保存dept的數(shù)據(jù)時,發(fā)現(xiàn)dept了外鍵,也把dept外鍵的對象保存在數(shù)據(jù)庫之中
級聯(lián)刪除
級聯(lián)刪除,這個對于我們來說風(fēng)險太大了,如果刪除了某些數(shù)據(jù),會把另外有關(guān)聯(lián)的數(shù)據(jù)也刪除...在實(shí)際中我們一般不使用!
在沒有設(shè)置級聯(lián)刪除的時候,我們試試刪除dept
//刪除部門為3的記錄
Dept dept1 = (Dept) session.get(dept.getClass(), 3);
session.delete(dept1);
它會先把3的外鍵對應(yīng)的記錄刪除,再刪除部門的數(shù)據(jù)
在設(shè)置級聯(lián)刪除的時候,我們試試刪除dept
級聯(lián)刪除數(shù)據(jù)
//刪除部門為4的記錄
Dept dept1 = (Dept) session.get(dept.getClass(), 4);
session.delete(dept1);
我們發(fā)現(xiàn)數(shù)據(jù)相關(guān)聯(lián)的數(shù)據(jù)都沒有了
cascade和inverse同時使用
上面我們已經(jīng)把cascade和inverse都介紹一遍了,那么cascade和inverse同時使用會怎么樣呢???我們來測試一下
設(shè)置dept沒有控制權(quán),但設(shè)置級聯(lián)保存、刪除
添加一個dept對象
//添加一個dept對象
session.save(dept);
如果我們單單設(shè)置了inverse屬性為true,那么數(shù)據(jù)庫中肯定是不能維護(hù)關(guān)聯(lián)關(guān)系的【這里我們已經(jīng)測試了】
但是呢,現(xiàn)在也設(shè)置了級聯(lián)保存,級聯(lián)保存是否可以讓該對象相關(guān)的關(guān)聯(lián)關(guān)系一并保存在數(shù)據(jù)庫中的。
我們來看看結(jié)果:
inverse的優(yōu)先級是比cascade的優(yōu)先級要高的,因此設(shè)置了inverse屬性為true,那么cascade就無效了。
參考詳細(xì)博文:
總結(jié)
上面的測試都是通過幾個方面的,看起來有點(diǎn)多,因此我們總結(jié)一下
inverse屬性
inverse屬性只能在“一”的一方中設(shè)置。inverse=false表示有控制權(quán),inverse=ture表示沒有控制權(quán)
在保存關(guān)聯(lián)信息時
有控制權(quán)--->可以保存相對應(yīng)的關(guān)聯(lián)數(shù)據(jù)
沒有控制權(quán)--->數(shù)據(jù)會保存,但是關(guān)聯(lián)關(guān)系沒有維護(hù),也就是外鍵列為NULL
在查詢數(shù)據(jù)時
有無控制權(quán)對查詢數(shù)據(jù)沒有任何影響
在解除關(guān)聯(lián)關(guān)系時
有控制權(quán)--->可以解除關(guān)聯(lián)關(guān)系
沒有控制權(quán)--->不能解除關(guān)聯(lián)關(guān)系,不會生成update語句,也不會報錯
在刪除數(shù)據(jù)時對關(guān)聯(lián)關(guān)系的影響
有控制權(quán)--->將外鍵的值設(shè)置為NULL,隨后刪除數(shù)據(jù)
沒有控制權(quán)--->如果刪除的記錄有被外鍵引用,會報錯,違反主外鍵引用約束,如果刪除的記錄沒有被引用,可以直接刪除。
多對多關(guān)系的時候也是一樣的,只不過多對多的關(guān)聯(lián)關(guān)系是在中間表中
cascade屬性
cascade有這么幾個值:
none 不級聯(lián)操作, 默認(rèn)值
save-update 級聯(lián)保存或更新
delete 級聯(lián)刪除
save-update,delete 級聯(lián)保存、更新、刪除
all 同上。級聯(lián)保存、更新、刪除
我們可能使用到的往往是:save-update這個值,因?yàn)榧壜?lián)刪除的風(fēng)險太大了!
級聯(lián)保存
沒有設(shè)置級聯(lián)保存-->如果單單保存一個對象,而對象又存在外鍵時,那么就會拋出異常
設(shè)置了級聯(lián)保存-->那么就可以將對象以及有關(guān)聯(lián)關(guān)系的對象一并保存
級聯(lián)刪除
沒有設(shè)置級聯(lián)刪除-->在刪除數(shù)據(jù)的時候,會把外鍵的字段設(shè)置為NULL,再刪除當(dāng)前一方的記錄
設(shè)置了級聯(lián)刪除-->把對象有關(guān)聯(lián)關(guān)系的記錄都刪除了
如果cascade和inverse同時設(shè)置時:
inverse屬性優(yōu)先級是要比cascade要高的
總結(jié)
以上是生活随笔為你收集整理的hibernate mysql cascade_Hibernate第五篇【inverse、cascade属性详解】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 3 float py 位小数 裁剪_对一
- 下一篇: 循环取矩阵的某行_1.2 震惊! 某大二