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,則程序在保存實體之
前指定的主鍵是無效的,它仍然根據數據來生成主鍵