Hibernate多对多关系

本文记录Java学习过程中遇到的Hibernate多对多关系~

多对多关系的表达

两个多方都维护一个<set>,使用table属性指定第三张表的名称,使用key标签指定在第三张表中的字段名,然后使用many-to-many中的class属性指定要关联的类,column指定关联的外键列名。

示例代码:

<set name="roles" table="sys_user_role">
	<key column="user_id"/>
	<many-to-many class="domain.Role" column="role_id" />
</set>

<set name="users" table="sys_user_role">
	<key column="role_id"/>
	<many-to-many class="domain.User" column="user_id" />
</set>

注意:多对多关系中,必须有一方放弃维护外键关系,否则会发生主键冲突,一般是被动方放弃关系维护。

多对多关系的相关操作

级联操作是指当主控方执行保存、更新或者删除操作时,其关联对象(被控方)也执行相同的操作。在映射文件中通过对cascade属性的设置来控制是否对关联对象采用级联操作,级联操作对各种关联关系都是有效的。

cascade的常见取值如下:

  • none:默认值,不进行级联操作;
  • save-update:级联保存更新;
  • delete:级联删除,多对多的时候不建议开启,一般都是不合理的;
  • all:save-update+delete。

放弃维护关系操作是指放弃外键的维护关系,也就是不再是双方同时维护外键关系,使用inverse属性配置。在多对多关系中,一般是被动的一方放弃维护,比如角色方,而不是用户方。

inverse的常见取值如下:

  • false:默认值,不放弃维护关系;
  • true:放弃维护关系。

标签: none