有人可以解释在xml映射文件中使用inverse,我正在阅读教程但是没有理解它在映射文件中的使用吗?
由于
答案 0 :(得分:7)
Inverse只决定关系中的哪个实体负责更新数据库以反映关联。
假设一对多的双向关联。代码A和B中有两个类,A包含一组B,B维护对A的引用。在数据库级别,只有一个外键需要更新,B表包含一个主键列A.
在这种情况下,假设我们在设置端放置inverse = true。这意味着只需向集合中添加实体就不会触发外键更新。因为更新外键的可靠性取决于B.因此,将B对象添加到A维护的集合不足以更新外键列。 objectA.addToSetOfB(objectB)不会影响外键。
仅当B被赋予对A的引用时,才会更新B表中的外键。因此,objectB.setA(objectA)肯定会更新外键并实际设置关系。
我认为同样的概念也会带来多对多的关系。
答案 1 :(得分:3)
如果集合被标记为“反向”,那么Hibernate将不会执行任何SQL来维护数据库中的集合。
例如,一对多的集合通常(根据我的经验,实际上总是)标记为反向:“许多”实体(集合的成员)有一个带有父代ID的列(映射为多个 - to-one property),简单地创建其中一个实体意味着它将隐式包含在集合中,因此不需要显式更新它们。
如果使用多对多集合(当然通常成对出现),其中一个集合需要标记为“反向”,否则Hibernate将尝试创建表示集合两次的连接表条目。
答案 2 :(得分:1)
在多对多关系中,您遵循联接的方向。
我们举个例子:
学生(IdStudent,StudentName)
课程(IdCourse,CourseName)
学生可以参加一门或多门课程,因此我们将在学生和课程之间建立一个联名表,名为StudentCourse(IdStudent,IdCourse)。
inverse属性需要在Course half上定位,因为它会指示Hibernate(它不太了解StudentCourse表)来正确构建其查询。
如果你将Student属性的inverse属性设置为true,Hibernate会认为联合表是CourseStudent(IdCourse,IdStudent)!!
对于一对多关系来说,这是相同的行为。
答案 3 :(得分:0)
反告诉hibernate必须管理外键,这样你就不会遇到引用实体的问题。如果您定义双向关系,则可以在对象的两侧进行导航。 inverse flag使您可以正确设置关系(以避免违反约束)。如果你没有定义反向标志,hibernate不知道如何更新inser语句。制作一个集合的一面告诉hibernate它是另一面的镜像。 hibernate总是需要将java转换为sql代码。
规则很简单: