成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Hibernate【inverse和cascade屬性】知識(shí)要點(diǎn)

abson / 1019人閱讀

摘要:屬性屬性表示控制權(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

相關(guān)文章

  • 納稅服務(wù)系統(tǒng)【總結(jié)】

    摘要:要是使用到日歷的話,我們想到使用這個(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è)面...

    ispring 評(píng)論0 收藏0
  • Java3y文章目錄導(dǎo)航

    摘要:前言由于寫的文章已經(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ù)連接池...

    KevinYan 評(píng)論0 收藏0
  • Hibernate 注解使用

    摘要:聲明添加對(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...

    Jinkey 評(píng)論0 收藏0
  • Hibernate最全面試題

    摘要:中怎樣實(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 持久化操作 提...

    張利勇 評(píng)論0 收藏0
  • Hibernate【緩存】知識(shí)要點(diǎn)

    摘要:對(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...

    AlphaWallet 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<