回答
逆正確決定關係中的哪個實體負責更新反映關聯的數據庫。
假設一對多雙向關聯。代碼A和B中有兩個類,A包含一組B,B維護對A的引用。在數據庫級別,只有一個外鍵要更新,B表包含一列到主鍵A.
在這種情況下,假設我們把inverse = true設置在set側。這意味着只需將一個實體添加到集合中就不會觸發外鍵更新。因爲更新外鍵的可恢復性取決於B.因此,將B對象添加到A維護的集合中並不足以更新外鍵列。 objectA.addToSetOfB(objectB)不會影響外鍵。
只有當B被賦予對A的引用時,表B中的外鍵纔會被更新。因此,objectB.setA(objectA)肯定會更新外鍵並實際設置關係。
我認爲相同的概念也會帶來多對多的關係。
在多對多的關係中,您遵循了加入的方向。
讓我們有一個例子:
學生(IdStudent,StudentName)
場(IdCourse,CourseName)
學生可以按照一個或多個課程,所以我們將在Student和Course之間建立一個名爲StudentCourse(IdStudent,IdCourse)的聯合表格。
逆向屬性需要定位在課程的一半,因爲它會向Hibernate(對StudentCourse表不瞭解太多)正確指出它的查詢。
如果你在學生一半上將inverse屬性設置爲true,Hibernate會認爲聯合表是CourseStudent(IdCourse,IdStudent)!
這對於一對多關係是相同的行爲。
如果一個集合被標記爲「反向」,那麼Hibernate將不會執行任何SQL來維護數據庫中的集合。例如,一對多集合通常(根據我的經驗,實際上總是)標記爲反向:「許多」實體(集合的成員)具有包含父級ID的列(映射爲多個一對一屬性),並且簡單地創建其中一個實體意味着它將隱式地包含在集合中,因此不需要顯式更新它們。
如果使用多對多集合(當然這通常是成對出現的),其中一個集合需要標記爲「反向」,否則Hibernate會嘗試創建兩次表示集合的連接表條目。
inverse告訴hibernate必須管理外鍵,以便您不會遇到參考實體的問題。如果您定義雙向關係,則可以在對象的兩側進行導航。反標誌使您能夠正確設置關係(以避免違反約束)。如果你沒有定義反標誌,hibernate不知道如何創建更新inser語句。讓一個集合的一面告訴休眠,它是另一面的鏡像。這是休眠將java轉換爲sql代碼所必需的。
直觀的規則:
規則雙向關係:
- 所有的雙向關聯需要一個側逆。
- 一個一對多 =>關聯中它必須是許多側
- 許多一對多 =>關聯,可以選擇任一側。
- 1. 匿名映射或文件映射?
- 2. Maven映射文件
- 3. JPA映射文件
- 4. 映射xml文件
- 5. DNS文件映射
- 6. 映射MARC文件
- 7. 的nHibernate映射文件
- 8. 內存映射文件 - 映射結構而不是文件?
- 9. 文本文件映射
- 10. MATLAB中的存儲器映射文件?
- 11. 休眠映射文件中的常量
- 12. Neo4j中的內存映射文件
- 13. 內存映射文件C++
- 14. SAS文件夾映射
- 15. GetFileSizeEx文件映射失敗
- 16. Windows映射文件系統
- 17. 增強映射文件RAII?
- 18. 內存映射文件.NET
- 19. 解釋gcc映射文件
- 20. 文件映射架構
- 21. 需要ntdll.dll映射文件
- 22. 容器文件映射卷
- 23. 映射到目標文件
- 24. 理解文件映射
- 25. Hadoop - 文件到塊映射
- 26. web.xml文件:URL映射
- 27. Windows內存映射文件
- 28. 內存映射文件
- 29. .ideavimrc文件映射Esc鍵
- 30. NHibernate映射文件幫助