Hibernate映射文件中的“Inverse”

4

有人能解释一下在xml映射文件中使用inverse的作用吗?我正在阅读教程,但无法理解它在映射文件中的用途?

谢谢

4个回答

8
逆向(Inverse)只是决定关系中哪个实体负责更新数据库以反映关联。假设一对多的双向关联,代码中有两个类A和B,A包含一个B的集合,B维护对A的引用。在数据库层面上,只需更新一个外键,B的表格包含A的主键列。在这种情况下,假设我们在集合端放置inverse = true。这意味着仅向集合中添加实体不会触发外键更新。因为更新外键的责任归于B。因此,仅将B对象添加到A维护的集合中是不足以更新外键列的,objectA.addToSetOfB(objectB)不会影响外键。只有给B一个对A的引用,B的表格中的外键才会更新。因此,objectB.setA(objectA)肯定会更新外键并实际建立关系。我认为相同的概念也适用于多对多的关系。

3
如果一个集合被标记为“inverse”,那么Hibernate将不执行任何SQL来维护数据库中的该集合。
例如,一对多的集合通常(在我的经验中,几乎总是)被标记为inverse:该集合的“多”实体(集合成员)具有父级ID的列(映射为多对一属性),并且仅创建其中一个实体意味着它将隐式包含在集合中,因此无需明确更新它们。
如果使用多对多集合(当然通常成对出现),则需要将其中一个集合标记为“inverse”,否则Hibernate将尝试两次创建表示该集合的连接表条目。

1

在多对多关系中,您需要遵循连接的方向。

让我们来看一个例子:

  • 学生(IdStudent,StudentName)

  • 课程(IdCourse,CourseName)

一个学生可以选修一门或多门课程,因此我们将在学生和课程之间建立一个联合表,命名为StudentCourse(IdStudent,IdCourse)。

反向属性需要放置在课程一侧,因为它将指示Hibernate(它对StudentCourse表不太了解)正确构建其查询。

如果您在学生一侧将反向属性设置为true,则Hibernate将认为联合表是CourseStudent(IdCourse,IdStudent)!!

对于一对多关系,它的行为也是相同的。


0

inverse告诉Hibernate如何管理外键,以避免引用实体的问题。如果您定义了双向关系,则可以在对象的两侧进行导航。inverse标志使您能够正确设置关系(以避免约束违规)。如果您不定义inverse标志,则Hibernate不知道如何创建更新插入语句。将集合的一侧设置为镜像告诉Hibernate它是另一侧的镜像。这对于Hibernate将Java转换为SQL代码始终是必需的。

规则很简单:

双向关系的规则:

  • 所有双向关联都需要一个方向作为反向。
  • 一对多 => 关联必须是多方
  • 多对多 => 关联可以选择任一方

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接