【发布时间】:2011-05-25 07:06:03
【问题描述】:
谁能解释一下在 xml 映射文件中使用 inverse,我正在阅读教程但无法理解它在映射文件中的使用??
谢谢
【问题讨论】:
标签: java sql database hibernate postgresql
谁能解释一下在 xml 映射文件中使用 inverse,我正在阅读教程但无法理解它在映射文件中的使用??
谢谢
【问题讨论】:
标签: java sql database hibernate postgresql
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,课程名称)
一个学生可以学习一门或多门课程,因此我们将在学生和课程之间建立一个名为 StudentCourse(IdStudent,IdCourse) 的联合表。
需要将 inverse 属性定位在 Course 一半上,因为它会指示 Hibernate(对 StudentCourse 表了解不多)正确构建其查询。
如果在Student那一半上把inverse属性设置为true,Hibernate会认为Joint Table是CourseStudent(IdCourse,IdStudent)!!
一对多关系的行为相同。
【讨论】:
inverse 告诉 hibernate 必须管理外键,这样你就不会遇到引用实体的问题。如果定义双向关系,则可以在对象的两侧导航。反向标志使您能够正确设置关系(以避免违反约束)。如果您没有定义反向标志,休眠不知道如何创建更新插入语句。制作集合的一侧告诉 hibernate 它是另一侧的镜像。这是hibernate将java转换为sql代码所必需的。
规则很简单:
【讨论】: