如何在hibernate中使用级联和反转?定义它们的过程/标记是什么?它们之间有关联吗?它们有什么用处?
发布于 2012-01-28 18:39:39
如果是通过中间表的多对多关系,"Cascade“表示是否在子表中创建/更新记录。而"Inverse“表示是否在中间表中创建/更新记录
例如,假设下面的场景1学生可以有多部电话。因此,Student类具有一组电话的属性。此外,一部手机可以由多名学生拥有。因此Phone类具有一组学生属性。此映射在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> 将创建一个新的学生对象,并将两个新的phone对象添加到它的集合中。然后调用session.save(student_obj)。根据"cascade“和"inverse”设置,将触发不同的查询。
下面是级联和逆序的不同组合及其影响。
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为save-update,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为save-update,反向为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 (即,学生是关系的所有者)时,将更新中间表STUD_PHONE。当反向为真时,Phone是关系的所有者,所以即使创建了一个新学生,中间表也没有更新。
因此,在两个实体关系的情况下,“级联”影响其他实体表,“反向”影响中间表。所以它们的作用是独立的。
发布于 2010-09-08 20:05:00
从Different between cascade and inverse链接引用的信息:
1.Inverse:这用来决定哪一方是管理关系的关系所有者(插入或更新外键列)。
2.级联:在级联中,当一个操作(保存、更新、删除)完成后,它将决定是否需要对另一个相互关联的实体调用其他操作(保存、更新、删除)。
结论:简而言之,“逆序”决定哪一方将更新外键,而“层叠”决定应该执行什么后续操作。两者在关系上看起来很相似,但这是完全不同的两件事。Hibernate开发人员值得花时间研究它,因为误解或误用它会在他们的应用程序中带来严重的性能或数据完整性问题。
另请查看论坛主题:https://forum.hibernate.org/viewtopic.php?f=1&t=949041
发布于 2018-11-12 02:02:14
这些是正交的概念。
在关联中,必须使用inverse属性或mappedBy属性( one-to-many/ many-to-one关联中的many侧和many-to-many关联中的任一侧)将其中一侧标记为反向。Hibernate需要这些信息来正确确定Java类(面向对象的关联)将如何映射到数据库表(关系关联)。
那级联呢--你可以显式地指定Hibernate在相关实体上执行操作:
CascadeType.PERSIST -当为所有者调用save()或persist()方法时,所有关联实体也是CascadeType.PERSIST-当为所有者调用save()方法时,所有关联实体也是deleted;CascadeType.MERGE -当为所有者调用delete()方法时,所有关联实体也被合并到托管/持久化state;CascadeType.REFRESH中-当为所有者调用refresh()方法时,所有关联实体也从其数据库表示中刷新;CascadeType.DETACH -当与此实体相关联的会话关闭时,所有相关实体将在分离的state;CascadeType.ALL中-包括所有级联operations;中删除时,从数据库中删除相关联的实体
https://stackoverflow.com/questions/3667387
复制相似问题