Kau*_*ele 86
在通过中间表的多对多关系的情况下; "Cascade"表示是否将在子表中创建/更新记录.而"反向"表示是否将在中间表中创建/更新记录
例如,假设下面的情景1学生可以拥有多部手机.所以学生班有手机套装的财产.此外,1部电话可由多名学生拥有.因此,Phone类具有Set of Students的属性.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>
Run Code Online (Sandbox Code Playgroud)
创建一个新的学生对象,并将2个新的手机对象添加到其集合中.而session.save(student_obj)被调用.根据"级联"和"反向"设置,将触发不同的查询.
以下是级联和反向的不同组合及其影响.
1)CASCADE IS 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 (?, ?)
Run Code Online (Sandbox Code Playgroud)
2)CASCADE为NONE且INVERSE为真
Hibernate: insert into STUDENT (Name, stud_id) values (?, ?)
Run Code Online (Sandbox Code Playgroud)
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 (?, ?)
Run Code Online (Sandbox Code Playgroud)
4)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 (?, ?)
Run Code Online (Sandbox Code Playgroud)
可以看出,只有当CASCADE进行了保存更新时,记录才会在PHONE表中创建.否则不是.
当INVERSE为假(即学生是关系的所有者)时,中间表STUD_PHONE被更新.当inverse为true时,Phone是关系的所有者,因此即使创建了新学生,也不会更新中间表.
因此,在两个实体的关系的情况下,"级联"影响其他实体表,"反向"影响中间表.所以他们的影响是独立的.
YoK*_*YoK 27
1. inverse:用于决定哪一方是关系所有者来管理关系(插入或更新外键列).
2.级联:级联中,完成一次操作(保存,更新和删除)后,将决定是否需要在另一个相互关联的实体上调用其他操作(保存,更新和删除).
结论:简而言之,"反向"决定哪一方将更新外键,而"级联"决定操作应该执行的操作.两者在关系上看起来非常相似,但它完全是两件不同的事情.Hibernate开发人员值得花时间研究它,因为误解概念或滥用它将在其应用程序中带来严重的性能或数据完整性问题.
另请查看此论坛主题:https://forum.hibernate.org/viewtopic.php?f = 1&t = 949041
这些是正交的概念。
在关联中,必须使用inverse属性或mappedBy属性将一侧标记为逆(many在one-to-many/ many-to-one关联中为一侧,在many-to-many关联中为任一侧)。Hibernate需要此信息来正确确定Java类(面向对象的关联)如何映射到数据库表(关系关联)。
级联怎么样-您可以明确指定Hibernate在关联实体上执行操作:
CascadeType.PERSIST- 为所有者调用save()or persist()方法时,还将保存所有关联的实体;CascadeType.REMOVE-当delete()调用所有者的方法时,所有关联的实体也会被删除;CascadeType.MERGE-当merge()调用所有者的方法时,所有关联的实体也将合并为托管/持久状态;CascadeType.REFRESH-当refresh()调用所有者的方法时,所有关联的实体也会从其数据库表示中刷新;CascadeType.DETACH -与该实体关联的会话关闭时,所有相关实体将处于分离状态;CascadeType.ALL -包括所有级联操作;| 归档时间: |
|
| 查看次数: |
56096 次 |
| 最近记录: |