OID、Cascade、API聚合與Inverse策略

1、OID(Object ID),即實體ID,它的兩種常用生成策略是native和assigned,其中native

  表示由數據庫自動生成實體對象的ID,Hibernate則不需要去維護關係外鍵,assigned

  表示在保存保存實體之前由程序指定;cascade表示在操作實體時是否支持級聯操作它所

  關聯的實體(默認值爲none,表示不發生任何DML級聯操作),inverse表示操作當前實

  體之後是否支持繼續維護關係表外鍵(默認值是false,表示當前實體被操作後可能會

  維護關係外鍵),API聚合表示在程序中是否注入關聯實體(即:級聯式API),在注入了

  關聯實體且cascade不爲none的情況下在操作當前實體之後將採用級聯方式操作關

  聯實體,在注入了關聯實體且inverse=false的情況下將維護關係外鍵,如果沒有注

  入關聯實體則僅僅操作當前實體

2、這幾者之間是相互發生作用和影響的,比如在獨立實體的級聯保存操作中,如果依賴

  實體的ID生成策略是assigned則級聯保存依賴實體時就會觸發對從表中實體ID是否

  發生重複的檢查,這可能會引起多次IO操作,降低DML操作效率,反過來,如果操作依賴

  實體時(必須注入獨立實體,因爲它要維護外鍵),獨立實體方的ID生成策略是

  assigned則同樣可能會引發對主表的多次IO檢查

3、ID的生成策略是我們不能任意選擇的,它多數情況下是依賴於業務需求和設計,因此

  爲了提升DML的操作效率,我們更多的時候是考慮分別操作獨立實體和依賴實體,而不

  是採用級聯的操作模式,所以,不論是獨立實體方還是函數依賴實體方,我們都推薦將

  cascade值設置爲none(即不發生任何級聯操作),如果實體需要維護關係外鍵則設置

  它爲false(默認值),否則顯式的設置它爲true

4、當cascade=none時,有如下操作情況:

  A、inverse=false 且 級聯式API——>維護關係外鍵,操作當前實體和外鍵表

  B、inverse=true  且 非級聯API——>不維護關係外鍵,僅操作當前實體

  實踐經驗表明:inverse=true的情況適用於獨立實體,inverse=false的情況適用於

  依賴實體,inverse屬性只有在set標籤中才存在,非set標籤中沒有inverse屬性,默

  認inverse屬性值爲false,表示默認情況下支持關係外鍵維護

注:ID生成策略爲assigned的情況:

  儘管數據庫中可能是identity或auto_increment方式生成主鍵,但是你仍然可以考  

  慮使用assigned模式指定實體主鍵,但是如果ID策略是native,則程序在保存實體之

  前指定的主鍵是無效的,它仍然根據數據來生成主鍵


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章