Hibernate中的Inverse和cascade屬性配置

來源:互聯網
上載者:User

Inverse和cascade是Hibernate映射中最難掌握的兩個屬性。兩者都在對象的關聯操作中發揮作用。

1.明確inverse和cascade的作用
inverse決定是否把對對象中集合的改動反映到資料庫中,所以inverse只對集合起作用,也就是只對one-to-many或many-to-many有效(因為只有這兩種關聯關係包含集合,而one-to-one和many-to-one只含有關係對方的一個引用)。
cascade決定是否把對對象的改動反映到資料庫中,所以cascade對所有的關聯關係都起作用(因為關聯關係就是指對象之間的關聯關係)。

 

2.inverse屬性:inverse所描述的是對象之間關聯關係的維護方式。
inverse只存在於集合標記的元素中。Hibernate提供的集合元素包括<set/> <map/> <list/> <array /> <bag />
Inverse屬性的作用是:是否將對集合對象的修改反映到資料庫中。
inverse屬性的預設值為false,表示對集合對象的修改會被反映到資料庫中;inverse=false 的為主動方,由主動方負責維護關聯關係。
inverse=”true” 表示對集合對象的修改不會被反映到資料庫中。

 為了維持兩個實體類(表)的關係,而添加的一些屬性,該屬性可能在兩個實體類(表)或者在一個獨立的表裡面,這個要看這雙方直接的對應關係了: 這裡的維護指的是當主控放進行增刪改查操作時,會同時對關聯關係進行對應的更新。

   一對多:該屬性在多的一方。應該在一方的設定 inverse=true ,多的一方設定 inverse=false(多的一方也可以不設定inverse屬性,因為預設值是false),這說明關聯關係由多的一方來維護。如果要一方維護關係,就會使在插入或是刪除"一"方時去update"多"方的每一個與這個"一"的對象有關係的對象。而如果讓"多"方面維護關係時就不會有update 操作,因為關係就是在多方的對象中的,直指插入或是刪除多方對象就行了。顯然這樣做的話,會減少很多操作,提高了效率。
註:
      單向one-to-many關聯關係中,不可以設定inverse="true",因為被控方的對應檔中沒有主控方的資訊。

   多對多:屬性在獨立表中。inverse屬性的預設值為false。在多對多關聯關係中,關係的兩端inverse不能都設為false,即預設的情況是不對的,如果都設為false,在做插入操作時會導致在關係表中插入兩次關係。也不能都設為true,如果都設為true,任何操作都不會觸發對關係表的操作。因此在任意一方設定inverse=true,另一方inverse=false。

   一對一:其實是一對多的一個特例,inverse 的設定也是一樣的,主要還是看關聯關係的屬性在哪一方,這一方的inverse=false。

   多對一:也就是一對多的反過來,沒什麼區別。
 

2.cascade屬性
cascade屬性的作用是描述關聯對象進行操作時的級聯特性。因此,只有涉及到關係的元素才有cascade屬性。
具有cascade屬性的標記包括<many-to-one /> <one-to-one /> <any /> <set /><bag /> <idbag /> <list /> <array />
注意:<ont-to-many />和 <many-to-many />是用在集合標記內部的,所以是不需要cascade屬性的。
級聯操作:指當主控方執行某項操作時,是否要對被關聯方也執行相同的操作。
 

3.inverse和cascade的區別
作用的範圍不同:

     Inverse是設定在集合元素中的。
   Cascade對於所有涉及到關聯的元素都有效。
   <many-to-one/><ont-to-many/>沒有inverse屬性,但有cascade屬性
執行的策略不同
   Inverse 會首先判斷集合的變化情況,然後針對變化執行相應的處理。
   Cascade 是直接對集合中每個元素執行相應的處理
執行的時機不同
     Inverse是在執行SQL語句之前判斷是否要執行該SQL語句
     Cascade則在主控方發生操作時用來判斷是否要進行級聯操作
執行的目標不同
     Inverse對於<ont-to-many>和<many-to-many>處理方式不相同。
   對於<ont-to-many>,inverse所處理的是對被關聯表進行修改操作。
   對於<many-to-many>,inverse所處理的則是中間關聯表
     Cascade不會區分這兩種關係的差別,所做的操作都是針對被關聯的對象。

總結:
<one-to-many>中,建議inverse=”true”,由“many”方來進行關聯關係的維護
<many-to-many>中,只設定其中一方inverse=”false”,或雙方都不設定
Cascade,通常情況下都不會使用。特別是刪除,一定要謹慎。
操作建議
  一般對many-to-one和many-to-many不設定級聯,這要看商務邏輯的需要;對one-to-one和one-to-many設定級聯。
  many-to-many關聯關係中,一端設定inverse=”false”,另一端設定為inverse=”true”。在one-to-many關聯關係中,設定inverse=”true”,由多端來維護關係表。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.