Hibernate 多对多关联映射配置

再弄多对多之前先弄清楚三个属性:

lazy(延迟加载):在多对多中延迟加载是必须的,因为不管哪一方都是对应另一方的多个数据,如果不设置延迟加载会非常浪费内存

inverse(放弃外键维护权):在多对多中,双方没有主次分别,所以两边都会对中间表的外键进行维护,就会进行重复操作,

尤其在进行保存的时候,会进行重复主键的添加,就会报主键重复异常,所以在多对多中必须有一方要放弃外键维护权,

放弃原则:操作少的一方放弃外键维护

cascade(级联操作):在多对多中不能加delete级联删除,可以加save-update级联保存和更新

接下来直接看代码

以用户和角色为例:一个用户可以有多种角色,一个角色可以被多个用户所拥有


public class User {
	private Long userId;
	private String userName;
	private Set<SysRole> roles = new HashSet<SysRole>();
	//set和get方法省略
}

public class Role {
	private Long roleId;
	private String roleName;
	private Set<SysUser> users = new HashSet<SysUser>();
	//set和get方法省略
}

关键是关系配置文件中怎么写:

关系映射文件的约束:就是加在头上的

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">



多对多主要配置信息

<set name="roles" table="t_person_role" >
		<key column="" /> //当前类在中间表的外键名称
		<many-to-many column="另一个外键" class="集合中存放的数据类型" /> 
	</set>


在关系配置文件中的所有的name都是指类的属性,column指定是对应表中的字段名

User.hbm.xml

<hibernate-mapping>
	<class name="cn.test.domain.User" table="sys_user" >
		<id name="userId" column="user_id" >
			<generator class="native"></generator>
		</id>
		<property name="userName" column="user_name"></property>
		<!-- 配置多对多 
			上面的配置很容易理解,name指的是属性名,column指的是对应的表中的字段名,一一对应关联
			下面就是关键配置了
		-->
		<set name="roles" table="sys_user_role" cascade="save-update" >
		<!-- name:类中的Set集合,table:中间表名,user是操作较多的,所以使用inverse默认值false,不放弃外键维护,cascade="save-update"级联保存更新 -->
			<key column="user_id" />	<!-- user表在中间表中的外键名-->
			<many-to-many column="role_id" class="cn.test.domain.Role" ></many-to-many>
			<!-- column="role_id":user表在中间表中的外键名
				class="cn.itcast.domain.Role":Role类的全路径
			 -->
		</set>
	</class>
</hibernate-mapping>


Role.hbm.xml

<hibernate-mapping>
	<class name="cn.test.domain.Role" table="sys_role" >
		<id name="roleId" column="role_id" >
			<generator class="native"></generator>
		</id>
		<property name="roleName" column="role_name"></property>
		<!-- 配置多对多 -->
		<set name="users" table="sys_user_role" inverse="true"><!-- 在这里角色操作少,所以放弃外键维护inverse="true" -->
			<key column="role_id" />	<!-- 当前类在中间表的外键名称 -->
			<many-to-many column="user_id" class="cn.test.domain.User" ></many-to-many>
			<!-- column="user_id":user表在中间表中的外键名
				class="cn.itcast.domain.User":User类的全路径
			 -->
		</set>
	</class>
</hibernate-mapping>




以上就是简单的多对多配置,这配置中主要要理解延迟加载,放弃外键维护和级联操作,

如果把这三者弄清楚了,多对多是很好理解的




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值