回答
逆正确决定关系中的哪个实体负责更新反映关联的数据库。
假设一对多双向关联。代码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映射文件帮助