一尘不染

Hibernate中级联和逆之间有什么区别,它们分别用于什么用途?

hibernate

如何在hibernate中使用级联和逆运算?定义它们的过程/标签是什么?它们彼此相关吗?它们如何有用?


阅读 310

收藏
2020-06-20

共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)CASCADE为NONE,而INVERSE为true

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

3)CASCADE为保存更新且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)CASCADE是保存更新的,并且是反向的

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为true时,Phone是关系的所有者,因此,即使创建了一个新学生,中介表也不会更新。

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

2020-06-20