標籤:lan 一致性 net 實體類 遍曆 hiberna 知識庫 本質 檔案中
1、含義:
inverse="true"就是反轉控制器=真;也就是由對方控制,
inverse="false"就是反轉控制器=假;也就是不用對方控制,由自己控制
2、到底在哪用inverse="ture"?
“set的inverse屬性決定是否把對set的改動反映到資料庫中去。inverse=false————反映;inverse=true————不反映”inverse屬性預設為false
inverse屬性預設是false的,就是說關係的兩端都來維護關係。這個意思就是說,如有一個Student, Teacher和TeacherStudent表,Student和Teacher是多對多對多關係,這個關係由TeacherStudent這個表來表 現。那麼什麼時候插入或刪除TeacherStudent表中的記錄來維護關係呢?在用hibernate時,我們不會顯示的對 TeacherStudent表做操作。對TeacherStudent的操作是hibernate幫我們做的。hibernate就是看hbm檔案中指 定的是"誰"維護關係,那個在插入或刪除"誰"時,就會處發對關係表的操作。前提是"誰"這個對象已經知道這個關係了,就是說關係另一頭的對象已經set 或是add到"誰"這個對象裡來了。前面說過inverse預設是false,就是關係的兩端都維護關係,對其中任一個操作都會處發對錶系表的操作。當在 關係的一頭,如Student中的bag或set中用了inverse="true"時,那就代表關係是由另一關維護的(Teacher)。就是說當這插 入Student時,不會操作TeacherStudent表,即使Student已經知道了關係。只有當Teacher插入或刪除時才會處發對關係表的 操作。所以,當關係的兩頭都用inverse="true"是不對的,就會導致任何操作都不處發對關係表的操作。當兩端都是inverse= "false"或是default值是,在代碼對關係顯示的維護也是不對的,會導致在關係表中插入兩次關係。
3、如何用,有好處?
在一對多關聯性中inverse就更有意義了。在多對多中,在哪端inverse="true"效果差不多(在效率上)。但是在一對多中,如果要一方維護關 系,就會使在插入或是刪除"一"方時去update"多"方的每一個與這個"一"的對象有關係的對象。而如果讓"多"方面維護關係時就不會有update 操作,因為關係就是在多方的對象中的,直指插入或是刪除多方對象就行了。當然這時也要遍曆"多"方的每一個對象顯示的操作修關係的變化體現到DB中。不管 怎樣說,還是讓"多"方維護關係更直觀一些。
讓多方維護好處的驗證見:http://www.cnblogs.com/Mr-Wu/archive/2012/09/24/2700023.html
(1)對one-to-many而言,改變set,會讓hibernate執行一系列的update語句, 不會delete/insert資料
(2)對many-to-many而言,改變set,只修改關係表的資料,不會影響many-to-many的另一方。
(3)雖然one-to-many和many-to-many的資料庫操作不一樣,但目的都是一個:維護資料的一致性。
總結
理解Inverse的本質含義是為了最佳化你的hibernate代碼,它可以避免許多不必要的update語句,如上述的“inverset=ture下的insert與update的例子”。
最後記住:inverse=“true”告訴hibernate具有關聯關係的兩個實體類哪一個是維護二者關係的關係擁有者。
hibernate配置參數