最近在在做一个项目的时候,遇到关于hibernate的双向多对多级联删除的问题,上网搜索关于多对多删除的解释很少,
但是双向多对多级联删除的需求也有很多,花了一整天
时间才彻底弄明白级联删除的相关细节问题。下面就我个人理解做相关总结。
下面是两个实体类中的多对多的映射关系配置:
注意:下面提到的父方和子方是通过inverse属性来设置的,如将inverse属性设置为true,意思是将当前表交给对方表来管理,即当前表为子方。反之,inverse属性为false,即当前表来维护关系。另外,不要将两个表的inverse属性都设置为true,否则会引发错误。
Information.hbm.xml文件
<set name="users" table="USER_INFORMATION" inverse="false" lazy="false" cascade="none">
<key>
<column name="INID" />
</key>
<many-to-many class="com.ckTime.domain.User" column="UID"/>
</set>
user.hbm.xml文件
<set name="infos" table="USER_INFORMATION" inverse="true" lazy="false" cascade="none">
<key>
<column name="UID" />
</key>
<many-to-many class="com.ckTime.domain.Information" column="INID"/>
</set>
关于双向多对多级联删除需求不同,cascade属性的值也就不一样。首先,先 给还不太清楚cascade属性作用的小伙伴们大概讲解一下:
cascade可以设置的值有 none,all,delete,save-update等等:
none:只删除父方和中间表的相关信息
all:级联删除或更新父方和子方表中的信息
delete:级联删除父方和子方的所有信息,包括中间表的信息
save-update:级联保存或修改子方和父方表中的信息
不同需求设置cascade值不同,下面应对不同需求,给出相关的cascade值:
① .级联保存或修改操作:cascade=“save-update”;
②.删除父方表和中间表的信息,但不删除子方表的信息:cascade=“none”;
③.既要做删除操作,还要做更新操作:cascade=“all”;
④.删除子方和父方表中的所有信息:cascade=“delete”;
小伙伴们可以根据自己的需求来选择设置不同的值,如有解释不当的地方,请指正,最后希望我的文章能帮到大家。