Hibernate級聯操作解密(inverse和cascade)

來源:互聯網
上載者:User

標籤:.com   lazy   總結   strong   驗證   str   ges   hash   key   

總結:

Cascade:對級聯操作進行限制,有如下幾個參數:

  all : 所有情況下均進行關聯操作。 
  none:所有情況下均不進行關聯操作。這是預設值。 
  save-update:在執行save/update/saveOrUpdate時進行關聯操作。 
  delete:在執行delete時進行關聯操作。

Inverse:在一對多模型中,只能在一的一方設定,inverse的作用就是在級聯發生後,會再次更新子表資料的外鍵為主表的主鍵。確保子表外鍵不會為空白。

下面示範一個班級學生的例子(一對多):

班級表javabean

public class Classes {

private Integer c_id;

private String c_name;

private String c_desc;

private Set<Student> student;

...}

班級表mapping

       .....其他欄位省略,唯寫關聯部分的代碼

        <set name="student" table="STUDENT" cascade="save-update" inverse="false" lazy="true">

            <key>

                <column name="C_ID" />//此處對應子表外鍵約束名

            </key>

            <one-to-many class="com.cky.model.Student" />

        </set>

學生表bean如下

public class Student {

private Integer s_id;

private String s_name;

private Integer s_age;

private Classes cls;

....}

學生表mapping

        ...其他欄位省略,唯寫關聯部分的代碼

        <many-to-one name="cls"  cascade="save-update" class="com.cky.model.Classes" fetch="join">

            <column name="C_ID" />//自己的外鍵約束名

        </many-to-one>

 

Classes 和Student是一對多關聯性,驗證inverse作用

1、當classes的descade=”save-update” inverse=”false”或者不寫(預設false)

執行如下操作:

Student st1=new Student("st1", 11);

Student st2=new Student("st2", 17);

Set<Student> stus=new HashSet<Student>();

stus.add(st1);

stus.add(st2);

//上面是建立兩個學生對象,並添加到stus集合中

//下面是建立classes對象,並將學生集合傳入

Classes cls=new Classes("班級1", "lal", stus);

ss.save(cls);

 

執行結果:注意最後的兩個更新操作

Hibernate: select max(C_ID) from CLASSES

Hibernate: select max(S_ID) from STUDENT

Hibernate: insert into CLASSES (C_NAME, C_DESC, C_ID) values (?, ?, ?)

Hibernate: insert into STUDENT (S_NAME, S_AGE, C_ID, S_ID) values (?, ?, ?, ?)

Hibernate: insert into STUDENT (S_NAME, S_AGE, C_ID, S_ID) values (?, ?, ?, ?)

Hibernate: update STUDENT set C_ID=? where S_ID=?

Hibernate: update STUDENT set C_ID=? where S_ID=?

 

 

二、當classes的descade=”save-update” inverse=”true”時

執行結果:注意沒有update了

Hibernate: select max(C_ID) from CLASSES

Hibernate: select max(S_ID) from STUDENT

Hibernate: insert into CLASSES (C_NAME, C_DESC, C_ID) values (?, ?, ?)

Hibernate: insert into STUDENT (S_NAME, S_AGE, C_ID, S_ID) values (?, ?, ?, ?)

Hibernate: insert into STUDENT (S_NAME, S_AGE, C_ID, S_ID) values (?, ?, ?, ?)

 

 

從結果可以看出來,當放棄維護關係的時候,少了兩個更新語句

Inverse:是否放棄維護關係,就是是否對子表外鍵的進行額外更新操作,保證子表外鍵是自己的主鍵。

當級聯發生時,有兩種情況:

1、如果inverse為false,即classes選擇維護關係的話。首先級聯添加時會把Student對象的值插入表,由於需要維護關係,所以他會再次更新這些資料的外鍵關係。

將外鍵更新成自己的主鍵,這樣他們一定有關係了。

2、如果inverse為true,即classes不維護關係,首先級聯添加時會把Student對象的值插入表,但不會再次更新這些資料的外鍵關係,如果資料沒有外鍵,就是空的,所以可以看到第二次執行中,由於我們建立Student對象時沒有指定classes,所以添加後表中的結果也是null。

 

總結:inverse只能在一的一方設定,inverse的作用就是在級聯發生時,會再次更新子表資料的外鍵為主表的主鍵。確保子表外鍵不會為空白。

正常情況都是將inverse設定成true來加快速度,子表資料的外鍵在建立子表對象時就設定好。

 

Hibernate級聯操作解密(inverse和cascade)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.