inverse理解
感覺老師講的inverse的理解有問題,inverse表示是否將控制權交給對方,為true表示交給對方,自己變成被空方。在一對多中,在一方設置inverse為true的話,g.add(stu),session.save(g),設置級聯為save-update,在數據庫中學生的外鍵其實為空,也就是說,其實在一方設置inverse為true,實際上是表示由多方維護關系,而g.add(stu)是多方在執行,所以沒有維護。其實,那句update并不是多余的,見https://www.mkyong.com/hibernate/inverse-true-example-and-explanation/
2017-06-23
1.(1)鏈接文章里有一句“In short, inverse=”true” means this is the relationship owner, and inverse=”false” (default) means it’s not.”,這句話明顯與文章下面的例子呈現相反的意思,但文章的例子與老師教的是相吻合的,應該只是作者打錯了而已。
(2)還有一句“Note?The third statement is really NOT necessary.” 這句話表達的也是update語句是不必要的,與老師講的也吻合。
2.我的理解
維護關系控制權指的是哪一方對關系作出的改動會生效,即引起hibernate執行更新。
維護關系影響的hibernate層面,所以無論是grade1.getStudents().add(student1);還是student1.setGrade(grade1);進行設置關聯關系,inverse屬性指定關聯關系的控制方向與數據庫是沒有關系的,數據庫的外鍵關系是在session被創建時(初始化配置文件及對象映射文件),就被確定了。
grade1.getStudents().add(student1);只是一個實例,就算沒有這條語句,創建表時兩張表的外鍵關系就已經存在了,所以對于數據庫來說grade1.getStudents().add(student1);和student1.setGrade(grade1);是一樣,都是相當于在添加對應實例指定具體的外鍵約束(沒有這一步兩張表的外鍵關系都是存在的,只是沒有數據去體現,一旦有數據,因為設置了increment主鍵生成策略,外鍵也不可能為null),兩個語句同時存在相當于執行了兩次外間約束的設置,而方向和控制權都是hibernate層面的東西, 所以控制臺反顯的update?sql語句確實是多余的。
參考:http://www.2cto.com/kf/201605/512903.html
2017-03-23
你可以試驗一下多對多關系,比如student和teacher,新增一個中間表tea_stu,如果你把student和teacher都互相添加對方的引用,并且set的inverse屬性都設置為true,tea_stu并不會自動添加外鍵
所謂的維護關聯就是維持外鍵關聯,然而如果把inverse都設為true,那么就是雙方都不維護關聯關系,所以不會自動添加外鍵。我這個不是提問,是糾錯,建議看一下這篇文章https://www.mkyong.com/hibernate/inverse-true-example-and-explanation/,并且自己試驗一下!
2017-03-23
inverse的值就是true和false,為false時表示一方維護關聯關系,為true是表示多方維護關聯關系!