映射文件中的Hibernate’Inverse’

有人可以解释在xml映射文件中使用inverse,我正在阅读教程但是没有理解它在映射文件中的使用?

谢谢

Inverse只决定关系中的哪个实体负责更新数据库以反映关联。

假设一对多的双向关联。 代码A和B中有两个类,A包含一组B,B维护对A的引用。在数据库级别,只有一个外键需要更新,B表包含一个主键列A.

在这种情况下,假设我们在设置端放置inverse = true。 这意味着只需向集合中添加实体就不会触发外键更新。 因为更新外键的可靠性取决于B.因此,将B对象添加到A维护的集合不足以更新外键列。 objectA.addToSetOfB(objectB)不会影响外键。

仅当B被赋予对A的引用时,才会更新B表中的外键。 因此,objectB.setA(objectA)肯定会更新外键并实际设置关系。

我认为同样的概念也会带来多对多的关系。

如果集合被标记为“反向”,则Hibernate将不执行任何SQL来维护数据库中的集合。

例如,一对多的集合通常(根据我的经验,实际上总是)标记为反向:“许多”实体(集合的成员)具有带有父代ID的列(映射为多对一)如果只是创建其中一个实体,则意味着它将隐式包含在集合中,因此无需显式更新它们。

如果使用多对多集合(当然通常成对出现),其中一个集合需要标记为“反向”,否则Hibernate将尝试创建表示集合两次的连接表条目。

在多对多关系中,您可以按照联接的方向进行操作。

我们举个例子:

  • 学生(IdStudent,StudentName)

  • 课程(IdCourse,CourseName)

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

inverse属性需要定位在Course half上,因为它将指示Hibernate(它不太了解StudentCourse表)来正确构建其查询。

如果你在Student half上将inverse属性设置为true,Hibernate会认为Joint Table是CourseStudent(IdCourse,IdStudent)!!

对于一对多关系来说,这是相同的行为。

inverse告诉hibernate必须管理外键,这样你就不会遇到引用实体的问题。 如果您定义双向关系,则可以在对象的两侧进行导航。 inverse flag使您可以正确设置关系(以避免违反约束)。 如果你没有定义反向标志,hibernate不知道如何更新inser语句。 制作一个集合的一面告诉hibernate它是另一面的镜像。 hibernate总是需要将java转换为sql代码。

规则很简单:

双向关系规则:

  • 所有双向关联都需要一侧作为反向。
  • 一对多 =>关联它必须是多方面的
  • 多对多 =>关联,你可以选择任何一方