回答
逆正确决定关系中的哪个实体负责更新反映关联的数据库。
假设一对多双向关联。代码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. 映射MARC文件
- 2. Maven映射文件
- 3. 的nHibernate映射文件
- 4. 内存映射文件 - 映射结构而不是文件?
- 5. 文本文件映射
- 6. 休眠映射文件中的常量
- 7. 内存映射文件C++
- 8. 需要ntdll.dll映射文件
- 9. SAS文件夹映射
- 10. .ideavimrc文件映射Esc键
- 11. 理解文件映射
- 12. Windows内存映射文件
- 13. 增强映射文件RAII?
- 14. 内存映射文件.NET
- 15. 解释gcc映射文件
- 16. 文件映射架构
- 17. NHibernate映射文件帮助
- 18. GetFileSizeEx文件映射失败
- 19. 文件系统 - 内存映射文件
- 20. Hibernate映射 - 包含映射的映射
- 21. 映射在.htaacess文件中
- 22. 如何在IntelliJ中映射文件?
- 23. 在Angular 2中映射node_modules文件夹
- 24. 已添加嵌入式资源映射文件 - 类未映射
- 25. Android纹理映射 - 使用PNG文件映射不正确
- 26. 部分取消映射Win32内存映射文件
- 27. 只使用映射或映射文件与休眠
- 28. 将数据库结构映射到nHibernate映射文件
- 29. 取消映射Vim插件映射
- 30. C#自动映射条件映射