如何在hibernate中使用级联和逆运算?定义它们的过程/标签是什么?它们彼此相关吗?它们如何有用?
在通过中介表进行多对多关系的情况下;“级联”表示是否在子表中创建/更新记录。而“反向”表示是否在中间表中创建/更新记录
例如,假设情况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)称为。根据“级联”和“反向”设置,将触发不同的查询。
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是关系的所有者,因此,即使创建了一个新学生,中介表也不会更新。
因此,在两个实体有关系的情况下,“级联”会影响其他实体表,而“反向”会影响中间表。因此它们的效果是独立的。