冬眠中的级联和逆有什么区别,它们的用途是什么?

2022-08-31 23:50:35

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


答案 1

在通过中间表进行多对多关系的情况下;“级联”表示是否将在子表中创建/更新记录。而“逆”表示是否将在中间表中创建/更新记录

例如,假设下面的场景1学生可以拥有多部手机。因此,学生班级具有一组电话的属性。此外,1部手机可以由多个学生拥有。因此,电话类具有学生组的属性。此映射stud_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) 级联为无,逆为假

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) 级联为无,逆为真

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

3) 级联是保存更新,而 INVERSE 是假的

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) 级联是保存更新和逆 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 为 false(即学生是关系的所有者)时,STUD_PHONE的中介表被更新。当逆 true 时,Phone 是关系的所有者,因此即使创建了一个新学生,中介表也不会更新。

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


答案 2

引用自级联和反向链接之间的差异

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

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

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

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


推荐