摘要:屬性屬性表示控制權(quán)是否轉(zhuǎn)移控制權(quán)已轉(zhuǎn)移當(dāng)前一方?jīng)]有控制權(quán)控制權(quán)沒(méi)有轉(zhuǎn)移當(dāng)前一方有控制權(quán)屬性,是在維護(hù)關(guān)聯(lián)關(guān)系的時(shí)候起作用的。表的外鍵并沒(méi)有數(shù)據(jù)結(jié)論如果設(shè)置控制反轉(zhuǎn)即然后通過(guò)部門方維護(hù)關(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)沒(méi)有轉(zhuǎn)移【當(dāng)前一方有控制權(quán)】
Inverse屬性,是在維護(hù)關(guān)聯(lián)關(guān)系的時(shí)候起作用的。只能在“一”的一方中使用該屬性!Inverse屬性的默認(rèn)值為fasle,也就是當(dāng)前一方是有控制權(quán)的
從一下的幾個(gè)方面看看Inverse在維護(hù)關(guān)聯(lián)關(guān)系時(shí)是否起作用:
保存數(shù)據(jù)
獲取數(shù)據(jù)
解除關(guān)聯(lián)關(guān)系
刪除數(shù)據(jù)對(duì)關(guān)聯(lián)關(guān)系的影響
保存數(shù)據(jù)將inverse屬性設(shè)置為ture,使dept沒(méi)有控制權(quán)
執(zhí)行保存數(shù)據(jù)操作時(shí),發(fā)現(xiàn)Hibernate只執(zhí)行了三條SQL語(yǔ)句。employee表的外鍵并沒(méi)有數(shù)據(jù)
結(jié)論:如果設(shè)置控制反轉(zhuǎn),即inverse=true, 然后通過(guò)部門方維護(hù)關(guān)聯(lián)關(guān)系。在保存部門的時(shí)候,同時(shí)保存員工, 數(shù)據(jù)會(huì)保存,但關(guān)聯(lián)關(guān)系不會(huì)維護(hù)。即外鍵字段為NULL
查詢數(shù)據(jù)設(shè)置inverse屬性為true,那么部門一方是沒(méi)有控制權(quán)的。
我們?cè)诓榭磾?shù)據(jù)的時(shí)候,發(fā)現(xiàn)inverse屬性對(duì)查詢數(shù)據(jù)是沒(méi)有影響的
//查詢出Dept對(duì)象 Dept de = (Dept) session.get(Dept.class, 1); System.out.println(dept.getDeptName()); System.out.println("-----------"); //用到的時(shí)候再查詢數(shù)據(jù)庫(kù),Hibernate的懶加載【后面會(huì)講解】 System.out.println(de.getSet());解除關(guān)聯(lián)關(guān)系
部門和員工是存在外鍵的聯(lián)系的,我們接下來(lái)看看inverse屬性對(duì)于解除關(guān)聯(lián)關(guān)系有沒(méi)有影響
當(dāng)部門一方有權(quán)限時(shí),即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)限時(shí),即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ù)對(duì)關(guān)聯(lián)關(guān)系的影響當(dāng)部門一方有權(quán)限時(shí),即inverse屬性為false
//查找部門id為2的信息 Dept dept1 = (Dept) session.get(Dept.class, 2); //刪除部門2 session.delete(dept1);
當(dāng)有控制權(quán)的時(shí)候可以刪除數(shù)據(jù),先把外鍵設(shè)置為NULL,再刪除數(shù)據(jù)!
當(dāng)部門一方?jīng)]有權(quán)限時(shí),即inverse屬性為true
//查找部門id為1的信息 Dept dept1 = (Dept) session.get(Dept.class, 1); //刪除部門1 session.delete(dept1);
直接拋出異常,說(shuō)該部門擁有外鍵,不能刪除數(shù)據(jù)!
cascade屬性cascade表示級(jí)聯(lián)的意思,簡(jiǎn)單來(lái)說(shuō)就是操作某一屬性時(shí),對(duì)其他關(guān)聯(lián)字段的影響
casecade屬性不像inverse屬性只能在“一”的一方設(shè)置,它可以在“一”的一方也可以在“多”的一方設(shè)置
cascade有這么幾個(gè)值
none 不級(jí)聯(lián)操作, 默認(rèn)值
save-update 級(jí)聯(lián)保存或更新
delete 級(jí)聯(lián)刪除
save-update,delete 級(jí)聯(lián)保存、更新、刪除
all 同上。級(jí)聯(lián)保存、更新、刪除
級(jí)聯(lián)保存級(jí)聯(lián)保存有什么用呢???我們來(lái)看個(gè)例子:
如果在保存對(duì)象的時(shí)候,沒(méi)有把相關(guān)的對(duì)象也一并保存進(jìn)數(shù)據(jù)庫(kù),會(huì)出現(xiàn)錯(cuò)誤。
因?yàn)樗鼤?huì)發(fā)現(xiàn)dept是有外鍵的,而外鍵又是一個(gè)對(duì)象來(lái)保存著,這個(gè)對(duì)象在數(shù)據(jù)庫(kù)表中并沒(méi)有存在,因此會(huì)拋出異常
//創(chuàng)建對(duì)象 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對(duì)象 session.save(dept);
如果我們?cè)赿ept中設(shè)置了級(jí)聯(lián)保存,那么Hibernate就會(huì)知道:保存dept的數(shù)據(jù)時(shí),發(fā)現(xiàn)dept了外鍵,也把dept外鍵的對(duì)象保存在數(shù)據(jù)庫(kù)之中
級(jí)聯(lián)刪除
級(jí)聯(lián)刪除,這個(gè)對(duì)于我們來(lái)說(shuō)風(fēng)險(xiǎn)太大了,如果刪除了某些數(shù)據(jù),會(huì)把另外有關(guān)聯(lián)的數(shù)據(jù)也刪除...在實(shí)際中我們一般不使用!
在沒(méi)有設(shè)置級(jí)聯(lián)刪除的時(shí)候,我們?cè)囋噭h除dept
//刪除部門為3的記錄 Dept dept1 = (Dept) session.get(dept.getClass(), 3); session.delete(dept1);
它會(huì)先把3的外鍵對(duì)應(yīng)的記錄刪除,再刪除部門的數(shù)據(jù)
在設(shè)置級(jí)聯(lián)刪除的時(shí)候,我們?cè)囋噭h除dept
級(jí)聯(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ù)都沒(méi)有了
cascade和inverse同時(shí)使用上面我們已經(jīng)把cascade和inverse都介紹一遍了,那么cascade和inverse同時(shí)使用會(huì)怎么樣呢???我們來(lái)測(cè)試一下
設(shè)置dept沒(méi)有控制權(quán),但設(shè)置級(jí)聯(lián)保存、刪除
添加一個(gè)dept對(duì)象
//添加一個(gè)dept對(duì)象 session.save(dept);
如果我們單單設(shè)置了inverse屬性為true,那么數(shù)據(jù)庫(kù)中肯定是不能維護(hù)關(guān)聯(lián)關(guān)系的【這里我們已經(jīng)測(cè)試了】
但是呢,現(xiàn)在也設(shè)置了級(jí)聯(lián)保存,級(jí)聯(lián)保存是否可以讓該對(duì)象相關(guān)的關(guān)聯(lián)關(guān)系一并保存在數(shù)據(jù)庫(kù)中的。
我們來(lái)看看結(jié)果:
inverse的優(yōu)先級(jí)是比cascade的優(yōu)先級(jí)要高的,因此設(shè)置了inverse屬性為true,就無(wú)法保存關(guān)聯(lián)關(guān)系了。
參考詳細(xì)博文:
http://www.cnblogs.com/whgk/p...
ascade和inverse總結(jié)上面的測(cè)試都是通過(guò)幾個(gè)方面的,看起來(lái)有點(diǎn)多,因此我們總結(jié)一下
inverse屬性inverse屬性只能在“一”的一方中設(shè)置。inverse=false表示有控制權(quán),inverse=ture表示沒(méi)有控制權(quán)
在保存關(guān)聯(lián)信息時(shí)
有控制權(quán)--->可以保存相對(duì)應(yīng)的關(guān)聯(lián)數(shù)據(jù)
沒(méi)有控制權(quán)--->數(shù)據(jù)會(huì)保存,但是關(guān)聯(lián)關(guān)系沒(méi)有維護(hù),也就是外鍵列為NULL
在查詢數(shù)據(jù)時(shí)
有無(wú)控制權(quán)對(duì)查詢數(shù)據(jù)沒(méi)有任何影響
在解除關(guān)聯(lián)關(guān)系時(shí)
有控制權(quán)--->可以解除關(guān)聯(lián)關(guān)系
沒(méi)有控制權(quán)--->不能解除關(guān)聯(lián)關(guān)系,不會(huì)生成update語(yǔ)句,也不會(huì)報(bào)錯(cuò)
在刪除數(shù)據(jù)時(shí)對(duì)關(guān)聯(lián)關(guān)系的影響
有控制權(quán)--->將外鍵的值設(shè)置為NULL,隨后刪除數(shù)據(jù)
沒(méi)有控制權(quán)--->如果刪除的記錄有被外鍵引用,會(huì)報(bào)錯(cuò),違反主外鍵引用約束,如果刪除的記錄沒(méi)有被引用,可以直接刪除。
多對(duì)多關(guān)系的時(shí)候也是一樣的,只不過(guò)多對(duì)多的關(guān)聯(lián)關(guān)系是在中間表中
cascade屬性cascade有這么幾個(gè)值:
none 不級(jí)聯(lián)操作, 默認(rèn)值
save-update 級(jí)聯(lián)保存或更新
delete 級(jí)聯(lián)刪除
save-update,delete 級(jí)聯(lián)保存、更新、刪除
all 同上。級(jí)聯(lián)保存、更新、刪除
我們可能使用到的往往是:save-update這個(gè)值,因?yàn)榧?jí)聯(lián)刪除的風(fēng)險(xiǎn)太大了!
級(jí)聯(lián)保存
沒(méi)有設(shè)置級(jí)聯(lián)保存-->如果單單保存一個(gè)對(duì)象,而對(duì)象又存在外鍵時(shí),那么就會(huì)拋出異常
設(shè)置了級(jí)聯(lián)保存-->那么就可以將對(duì)象以及有關(guān)聯(lián)關(guān)系的對(duì)象一并保存
級(jí)聯(lián)刪除
沒(méi)有設(shè)置級(jí)聯(lián)刪除-->在刪除數(shù)據(jù)的時(shí)候,會(huì)把外鍵的字段設(shè)置為NULL,再刪除當(dāng)前一方的記錄
設(shè)置了級(jí)聯(lián)刪除-->把對(duì)象有關(guān)聯(lián)關(guān)系的記錄都刪除了
如果cascade和inverse同時(shí)設(shè)置時(shí):
inverse屬性優(yōu)先級(jí)是要比cascade要高的,如果inverse屬性設(shè)置了true,那么就無(wú)法保存關(guān)聯(lián)關(guān)系了
如果文章有錯(cuò)的地方歡迎指正,大家互相交流。習(xí)慣在微信看技術(shù)文章,想要獲取更多的Java資源的同學(xué),可以關(guān)注微信公眾號(hào):Java3y
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/68718.html
摘要:要是使用到日歷的話,我們想到使用這個(gè)日歷類上面僅僅是我個(gè)人總結(jié)的要點(diǎn),如果有錯(cuò)誤的地方還請(qǐng)大家給我指正。 納稅服務(wù)系統(tǒng)總結(jié) 納稅服務(wù)系統(tǒng)是我第一個(gè)做得比較大的項(xiàng)目(不同于javaWeb小項(xiàng)目),該項(xiàng)目系統(tǒng)來(lái)源于傳智Java32期,十天的視頻課程(想要視頻的同學(xué)關(guān)注我的公眾號(hào)就可以直接獲取了) 我跟著練習(xí)一步一步完成需求,才發(fā)覺(jué)原來(lái)Java是這樣用來(lái)做網(wǎng)站的,Java有那么多的類庫(kù),頁(yè)面...
摘要:前言由于寫的文章已經(jīng)是有點(diǎn)多了,為了自己和大家的檢索方便,于是我就做了這么一個(gè)博客導(dǎo)航。 前言 由于寫的文章已經(jīng)是有點(diǎn)多了,為了自己和大家的檢索方便,于是我就做了這么一個(gè)博客導(dǎo)航。 由于更新比較頻繁,因此隔一段時(shí)間才會(huì)更新目錄導(dǎo)航哦~想要獲取最新原創(chuàng)的技術(shù)文章歡迎關(guān)注我的公眾號(hào):Java3y Java3y文章目錄導(dǎo)航 Java基礎(chǔ) 泛型就這么簡(jiǎn)單 注解就這么簡(jiǎn)單 Druid數(shù)據(jù)庫(kù)連接池...
摘要:聲明添加對(duì)樂(lè)觀鎖定的支持一些屬性關(guān)聯(lián)關(guān)系獲取方式即是否采用延時(shí)加載及時(shí)加載,是在查詢數(shù)據(jù)時(shí),也直接一起獲取關(guān)聯(lián)對(duì)象的數(shù)據(jù)。在前面的基礎(chǔ)上增加課程類并補(bǔ)充學(xué)生類學(xué)生類負(fù)責(zé)關(guān)聯(lián)關(guān)系 Hibernate 注解使用 在Hibernate中通常配置對(duì)象關(guān)系映射關(guān)系有兩種,一種是基于xml的方式,另一種是基于Hibernate Annotation庫(kù)的注解方式。在Hibernate 3.2版本和J...
摘要:中怎樣實(shí)現(xiàn)類之間的關(guān)系如一對(duì)多多對(duì)多的關(guān)系中怎樣實(shí)現(xiàn)類之間的關(guān)系如一對(duì)多多對(duì)多的關(guān)系它們通過(guò)配置文件中的來(lái)實(shí)現(xiàn)類之間的關(guān)聯(lián)關(guān)系的。 Hibernate常見面試題 Hibernate工作原理及為什么要用? Hibernate工作原理及為什么要用? 讀取并解析配置文件 讀取并解析映射信息,創(chuàng)建SessionFactory 打開Sesssion 創(chuàng)建事務(wù)Transation 持久化操作 提...
摘要:對(duì)象狀態(tài)中對(duì)象的狀態(tài)臨時(shí)瞬時(shí)狀態(tài)持久化狀態(tài)游離狀態(tài)學(xué)習(xí)的對(duì)象狀態(tài)是為了更清晰地知道的設(shè)計(jì)思想,以及是一級(jí)緩存的基礎(chǔ)當(dāng)然啦,也就一點(diǎn)點(diǎn)知識(shí)臨時(shí)瞬時(shí)狀態(tài)當(dāng)我們直接出來(lái)的對(duì)象就是臨時(shí)瞬時(shí)狀態(tài)的該對(duì)象還沒(méi)有被持久化沒(méi)有保存在數(shù)據(jù)庫(kù)中不受的管理持久化 對(duì)象狀態(tài) Hibernate中對(duì)象的狀態(tài): 臨時(shí)/瞬時(shí)狀態(tài) 持久化狀態(tài) 游離狀態(tài) 學(xué)習(xí)Hibernate的對(duì)象狀態(tài)是為了更清晰地知道Hiber...
閱讀 3672·2021-09-07 09:59
閱讀 728·2019-08-29 15:12
閱讀 814·2019-08-29 11:14
閱讀 1320·2019-08-26 13:27
閱讀 2674·2019-08-26 10:38
閱讀 3143·2019-08-23 18:07
閱讀 1284·2019-08-23 14:40
閱讀 1933·2019-08-23 12:38