天天看點

Hibernate之inverse和cascade詳解

文章:Hibernate自學詳細筆記

    繼Hibernate學習筆記整理之後,發現inverse和cascade這兩個屬性在配置過程中比較含糊,仔細比較一下是有些地方比較像,是以很容易搞糊塗。借助此文來闡述下inverse和cascade的差別。

什麼是inverse?

    預設值為false;也就是雙方都可以維護關系。如果在一方中顯示的設定為false的話那麼就意味着本方維護關系。如果設定為true的話表示本方不維護關聯關系。

    隻是影響是否能設定外鍵列的值(設成有效值或是null值),對擷取資訊沒有影響。如果兩端都設定為true的時候是不對的,這樣的情況下會導緻沒有人維護關聯關系。

什麼是Cascade?

     預設是none。表示不級聯。

    all:所有情況下都進行關聯操作。

    save-update:在執行save/update/saveorupdate的時候進行關聯操作。

    delete:在delete的時候進行關聯操作。

    什麼意思呢?

    就是說:當A、B兩個對象有關聯關系的時候,如果這時候映射時設定為delete的話,那麼在删除A的時候會級聯的删除B。使得資料保持完整性限制。

什麼不同呢?

     inverse和cascade沒有什麼關系。

    Commit後,這兩個屬性發揮作用的時間是不一樣的,Hibernate會根據對象的改變,以及casade的屬性的設定生成一系列的action,比如增删改的action,每個action都有自己的execute方法以及執行的sql語句。當所有的action生成好之後,Hibernate會執行他們,這時候檢查inverse屬性的值,如果設定為true那麼不執行,如果是false的話就執行sql。    

    cascade是在主要方操作的時候級聯發生的。inverse:在送出後flush時,對session的所有set,Hibernate會判斷有沒有更新,如果有對對應的有變化的set執行sql,執行sql之前先判斷inverse,if(inverse == true) return;

Hibernate 優化:inverse

    inverse在多對多的關系中發揮作用不大(對運作的效率來說),但是在一對多的關聯關系中作用是巨大的,一對多的關系中,如果設定為一的一方維護關聯關系,那麼每次改變(比如說:删除)“一”的一方資料時,因為“一”的這一方要維護關聯關系那麼勢必要改變多個“多”的一方中表中關聯的資料。因為“多”的這一方資料是很多的,讓“一”的一方來維護的話那麼就會更新多次“多”的一方的資料,如果讓多方維護資料的時候,如果“一”的一方删除時隻需要設定多的一方的與之關聯的資料列為null即可。

      當一的這方加載對象内容的時候,一這方維護關系那麼會主動去加載多的這方所與之關聯的對象,而當多這一方維護關聯關系的時候,則效率就大大提升了,多的一方隻需要加載一方的内容就可以了,這樣的話所需要的代價更低。

繼續閱讀