2010-12-14 82 views

回答

7

逆正确决定关系中的哪个实体负责更新反映关联的数据库。

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

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

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

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

1

在多对多的关系中,您遵循了加入的方向。

让我们有一个例子:

  • 学生(IdStudent,StudentName)

  • 场(IdCourse,CourseName)

学生可以按照一个或多个课程,所以我们将在Student和Course之间建立一个名为StudentCourse(IdStudent,IdCourse)的联合表格。

逆向属性需要定位在课程的一半,因为它会向Hibernate(对StudentCourse表不了解太多)正确指出它的查询。

如果你在学生一半上将inverse属性设置为true,Hibernate会认为联合表是CourseStudent(IdCourse,IdStudent)!

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

3

如果一个集合被标记为“反向”,那么Hibernate将不会执行任何SQL来维护数据库中的集合。例如,一对多集合通常(根据我的经验,实际上总是)标记为反向:“许多”实体(集合的成员)具有包含父级ID的列(映射为多个一对一属性),并且简单地创建其中一个实体意味着它将隐式地包含在集合中,因此不需要显式更新它们。

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

0

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

直观的规则:

规则双向关系:

  • 所有的双向关联需要一个侧逆。
  • 一个一对多 =>关联中它必须是许多侧
  • 许多一对多 =>关联,可以选择任一侧