在通过中介表进行多对多关系的情况下;“级联”表示是否在子表中创建/更新记录。而“反向”表示是否在中间表中创建/更新记录
例如,假设在方案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 column="mapping_phon_id"/></set>
将创建一个新的Student对象,并将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是关系的所有者,因此,即使创建了一个新学生,中介表也不会更新。
因此,在两个实体有关系的情况下,“级联”会影响其他实体表,而“逆”会影响中间表。因此它们的效果是独立的。



