通过中间表建立多对多关系的情况; “Cascade”表示是否将在子表中创建/更新记录。而“Inverse”表示是否会在中间表中创建/更新记录
例如假设以下场景
1 名学生可以拥有多部手机。所以学生类有一组手机的属性。
另外,一部手机可以由多个学生拥有。因此,电话类具有学生集的属性。
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 为 NONE,INVERSE 为 false
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 为 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 为保存更新且 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 为 false 时(即 Student 是关系的所有者),中间表 STUD_PHONE 被更新。当 inverse 为 true 时,Phone 是关系的所有者,因此即使创建了新学生,中间表也不会更新。
因此,在两个实体存在关系的情况下,“级联”影响其他实体表,“逆”影响中间表。所以它们的作用是独立的。