映射文件中的Hibernate'Inverse'

时间:2010-12-14 13:41:57

标签: java sql database hibernate postgresql

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

由于

4 个答案:

答案 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代码。

规则很简单:

双向关系规则:

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