46

如何在休眠中使用级联和逆向?定义它们的程序/标签是什么?它们是否相互关联,它们有什么用处?

4

3 回答 3

90

通过中间表的多对多关系;“级联”表示是否将在子表中创建/更新记录。而“反向”表示是否将在中间表中创建/更新记录

例如,假设以下场景 1 学生可以拥有多部手机。所以学生类有一组电话的属性。1部电话也可以由多个学生拥有。所以 Phone 类具有一组学生的属性。stud_phone 表中提到了此映射。

所以有三个表,即。Student、Phone 和 stud_phone(中介)表。映射可能如下所示:

<set name="phoneset" table="stud_phone" cascade="save-update" inverse="true">
  <key column="mapping_stud_id">< /key>
  <many-to-many class="com.domain.Phone" column="mapping_phon_id"/>
</set> 

创建了一个新的学生对象,并将 2 个新的音素对象添加到其集合中。session.save(student_obj)并被称为。根据“级联”和“反向”设置,将触发不同的查询。

以下是级联和反向的不同组合及其影响。

1) CASCADE IS NONE 并且 INVERSE 为假

Hibernate: insert into STUDENT (Name, stud_id) values (?, ?)
Hibernate: insert into stud_phone (mapping_stud_id, mapping_phon_id) values (?, ?)
Hibernate: insert into stud_phone (mapping_stud_id, mapping_phon_id) values (?, ?)

2) CASCADE 为 NONE 并且 INVERSE 为真

Hibernate: insert into STUDENT (Name, stud_id) values (?, ?)

3) CASCADE 是 save-update 并且 INVERSE 是 false

Hibernate: insert into STUDENT (Name, stud_id) values (?, ?)
Hibernate: insert into phone (phone_num, phone_id) values (?, ?)
Hibernate: insert into phone (phone_num, phone_id) values (?, ?)
Hibernate: insert into stud_phone (mapping_stud_id, mapping_phon_id) values (?, ?)
Hibernate: insert into stud_phone (mapping_stud_id, mapping_phon_id) values (?, ?)

4) CASCADE 是 save-update 和 INVERSE true

Hibernate: insert into STUDENT (Name, stud_id) values (?, ?)
Hibernate: insert into phone (phone_num, phone_id) values (?, ?)
Hibernate: insert into phone (phone_num, phone_id) values (?, ?)

可以看出,只有当 CASCADE 保存更新时,记录才会在 PHONE 表中创建。否则不行。

当 INVERSE 为假时(即 Student 是关系的所有者),中间表 STUD_PHONE 被更新。当 inverse 为真时,Phone 是关系的所有者,因此即使创建了一个新学生,中间表也不会更新。

因此,在两个实体的关系中,“级联”影响其他实体表,“反向”影响中间表。所以它们的作用是独立的。

于 2012-01-28T10:39:38.587 回答
27

级联和反向链接之间的差异引用的信息:

1. inverse:这个用来决定哪一方是关系所有者来管理关系(插入或更新外键列)。

2. 级联:在级联中,在完成一个操作(保存、更新和删除)后,它会决定是否需要对另一个相互有关系的实体调用其他操作(保存、更新和删除)。

结论:简而言之,“逆”决定了哪一方将更新外键,而“级联”决定了后续操作应该执行什么。两者的关系看起来很相似,但这是完全不同的两件事。Hibernate 开发人员值得花时间研究它,因为误解或滥用它会给他们的应用程序带来严重的性能或数据完整性问题。

另请查看此论坛主题:https ://forum.hibernate.org/viewtopic.php?f=1&t=949041

于 2010-09-08T12:05:00.400 回答
7

这些是正交概念。

在关联中,必须使用inverse属性或mappedBy属性(manyside in one-to-many/ many-to-oneassociation 和 any side in many-to-manyassociation)将一侧标记为反向。Hibernate 需要此信息来正确确定 Java 类(面向对象的关联)将如何映射到数据库表(关系关联)。

级联怎么样 - 您可以明确指定 Hibernate 对关联实体执行操作:

  • CascadeType.PERSIST- 当为所有者调用save()orpersist()方法时,所有关联的实体也被保存;
  • CascadeType.REMOVE- 当delete()为所有者调用该方法时,所有关联的实体也被删除;
  • CascadeType.MERGE-merge()为所有者调用该方法时,所有关联实体也合并为托管/持久状态;
  • CascadeType.REFRESH- 当refresh()为所有者调用该方法时,所有关联实体也会从它们的数据库表示中刷新;
  • CascadeType.DETACH- 当与该实体关联的会话关闭时,所有相关实体将处于分离状态;
  • CascadeType.ALL- 包括所有级联操作;
  • “孤立删除” - 当从关系中删除该实体时,从数据库中删除关联实体。
于 2018-11-11T18:02:13.910 回答