Hibernate【inverse和cascade屬性】知識要點

Inverse屬性

Inverse屬性:表示控制權是否轉移..html

  • true:控制權已轉移【當前一方沒有控制權】
  • false:控制權沒有轉移【當前一方有控制權】

Inverse屬性,是在維護關聯關係的時候起做用的。只能在「一」的一方中使用該屬性!Inverse屬性的默認值爲fasle,也就是當前一方是有控制權的java

這裏寫圖片描述

從一下的幾個方面看看Inverse在維護關聯關係時是否起做用數據庫

  • 保存數據
  • 獲取數據
  • 解除關聯關係
  • 刪除數據對關聯關係的影響

保存數據

將inverse屬性設置爲ture,使dept沒有控制權微信

<!--維護關係的是Set集合,對應employee表-->
        <set  cascade="save-update" name="set" table="employee" inverse="true">

執行保存數據操做時,發現Hibernate只執行了三條SQL語句。employee表的外鍵並無數據session

這裏寫圖片描述

結論:若是設置控制反轉,即inverse=true, 而後經過部門方維護關聯關係。在保存部門的時候,同時保存員工, 數據會保存,但關聯關係不會維護。即外鍵字段爲NULL測試


查詢數據

設置inverse屬性爲true,那麼部門一方是沒有控制權的。spa

<set  cascade="save-update" name="set" table="employee" inverse="true">

咱們在查看數據的時候,發現inverse屬性對查詢數據是沒有影響的3d

//查詢出Dept對象
        Dept de = (Dept) session.get(Dept.class, 1);
        System.out.println(dept.getDeptName());

        System.out.println("-----------");
        //用到的時候再查詢數據庫,Hibernate的懶加載【後面會講解】
        System.out.println(de.getSet());

這裏寫圖片描述


解除關聯關係

部門和員工是存在外鍵的聯繫的,咱們接下來看看inverse屬性對於解除關聯關係有沒有影響code

  • 當部門一方有權限時,即inverse屬性爲false
//查找部門id爲1的信息
        Dept dept1 = (Dept) session.get(Dept.class, 1);

        //清除關聯信息
        dept1.getSet().clear();

能夠解除關聯關係,employee的外鍵字段被設置爲NULL了xml

這裏寫圖片描述

  • 當部門一方沒有權限時,即inverse屬性爲true
//查找部門id爲2的信息
        Dept dept1 = (Dept) session.get(Dept.class, 2);

        //清除關聯信息
        dept1.getSet().clear();

不能解除關聯關係

這裏寫圖片描述


刪除數據對關聯關係的影響

  • 當部門一方有權限時,即inverse屬性爲false
//查找部門id爲2的信息
        Dept dept1 = (Dept) session.get(Dept.class, 2);

        //刪除部門2
        session.delete(dept1);

當有控制權的時候能夠刪除數據,先把外鍵設置爲NULL,再刪除數據!

這裏寫圖片描述

  • 當部門一方沒有權限時,即inverse屬性爲true
//查找部門id爲1的信息
        Dept dept1 = (Dept) session.get(Dept.class, 1);

        //刪除部門1
        session.delete(dept1);

直接拋出異常,說該部門擁有外鍵,不能刪除數據!

這裏寫圖片描述


cascade屬性

cascade表示級聯的意思,簡單來講就是操做某一屬性時,對其餘關聯字段的影響

casecade屬性不像inverse屬性只能在「一」的一方設置,它能夠在「一」的一方也能夠在「多」的一方設置

cascade有這麼幾個值

  • none 不級聯操做, 默認值
  • save-update 級聯保存或更新
  • delete 級聯刪除
  • save-update,delete 級聯保存、更新、刪除
  • all 同上。級聯保存、更新、刪除

級聯保存

級聯保存有什麼用呢???咱們來看個例子:

  • 若是在保存對象的時候,沒有把相關的對象也一併保存進數據庫,會出現錯誤
  • 由於它會發現dept是有外鍵的,而外鍵又是一個對象來保存着,這個對象在數據庫表中並無存在,所以會拋出異常
//建立對象
        Dept dept = new Dept();
        dept.setDeptName("開發部");

        Employee zs = new Employee();
        zs.setEmpName("張珊");
        zs.setSalary(1111);
        Employee ls = new Employee();
        ls.setEmpName("李四");
        ls.setSalary(2222);

        //維護關係
        dept.getSet().add(zs);
        dept.getSet().add(ls);

        //保存dept對象
        session.save(dept);

這裏寫圖片描述

若是咱們在dept中設置了級聯保存,那麼Hibernate就會知道:保存dept的數據時,發現dept了外鍵,也把dept外鍵的對象保存在數據庫之中

<set name="set" table="employee" cascade="save-update" >

這裏寫圖片描述


級聯刪除

級聯刪除,這個對於咱們來講風險太大了,若是刪除了某些數據,會把另外有關聯的數據也刪除...在實際中咱們通常不使用!

  • 在沒有設置級聯刪除的時候,咱們試試刪除dept
//刪除部門爲3的記錄
        Dept dept1 = (Dept) session.get(dept.getClass(), 3);
        session.delete(dept1);

它會先把3的外鍵對應的記錄刪除,再刪除部門的數據

這裏寫圖片描述

  • 在設置級聯刪除的時候,咱們試試刪除dept
<set name="set" table="employee" cascade="save-update,delete"  >
  • 級聯刪除數據
//刪除部門爲4的記錄
        Dept dept1 = (Dept) session.get(dept.getClass(), 4);
        session.delete(dept1);

咱們發現數據相關聯的數據都沒有了

這裏寫圖片描述


cascade和inverse同時使用

上面咱們已經把cascade和inverse都介紹一遍了,那麼cascade和inverse同時使用會怎麼樣呢???咱們來測試一下

  • 設置dept沒有控制權,但設置級聯保存、刪除
<set name="set" table="employee" cascade="save-update,delete" inverse="true"  >
  • 添加一個dept對象
//添加一個dept對象
        session.save(dept);

若是咱們單單設置了inverse屬性爲true,那麼數據庫中確定是不能維護關聯關係的【這裏咱們已經測試了】

可是呢,如今也設置了級聯保存,級聯保存是否可讓該對象相關的關聯關係一併保存在數據庫中的

咱們來看看結果:

這裏寫圖片描述

inverse的優先級是比cascade的優先級要高的,所以設置了inverse屬性爲true,就沒法保存關聯關係了。

參考詳細博文:

http://www.cnblogs.com/whgk/p...

ascade和inverse總結

上面的測試都是經過幾個方面的,看起來有點多,所以咱們總結一下

inverse屬性

inverse屬性只能在「一」的一方中設置。inverse=false表示有控制權,inverse=ture表示沒有控制權

  • 在保存關聯信息時

    • 有控制權--->能夠保存相對應的關聯數據
    • 沒有控制權--->數據會保存,可是關聯關係沒有維護,也就是外鍵列爲NULL
  • 在查詢數據時

    • 有無控制權對查詢數據沒有任何影響
  • 在解除關聯關係時

    • 有控制權--->能夠解除關聯關係
    • 沒有控制權--->不能解除關聯關係,不會生成update語句,也不會報錯
  • 在刪除數據時對關聯關係的影響

    • 有控制權--->將外鍵的值設置爲NULL,隨後刪除數據
    • 沒有控制權--->若是刪除的記錄有被外鍵引用,會報錯,違反主外鍵引用約束,若是刪除的記錄沒有被引用,能夠直接刪除

多對多關係的時候也是同樣的,只不過多對多的關聯關係是在中間表中

cascade屬性

cascade有這麼幾個值:

  • none 不級聯操做, 默認值
  • save-update 級聯保存或更新
  • delete 級聯刪除
  • save-update,delete 級聯保存、更新、刪除
  • all 同上。級聯保存、更新、刪除

咱們可能使用到的每每是:save-update這個值,由於級聯刪除的風險太大了

  • 級聯保存

    • 沒有設置級聯保存-->若是單單保存一個對象,而對象又存在外鍵時,那麼就會拋出異常
    • 設置了級聯保存-->那麼就能夠將對象以及有關聯關係的對象一併保存
  • 級聯刪除

    • 沒有設置級聯刪除-->在刪除數據的時候,會把外鍵的字段設置爲NULL,再刪除當前一方的記錄
    • 設置了級聯刪除-->把對象有關聯關係的記錄都刪除了

若是cascade和inverse同時設置時:

  • inverse屬性優先級是要比cascade要高的,若是inverse屬性設置了true,那麼就沒法保存關聯關係了

若是文章有錯的地方歡迎指正,你們互相交流。習慣在微信看技術文章,想要獲取更多的Java資源的同窗,能夠 關注微信公衆號:Java3y
相關文章
相關標籤/搜索