您的位置:首页 > 编程语言 > Java开发

Hibernate 多对多关联映射配置

2017-11-03 17:16 211 查看
再弄多对多之前先弄清楚三个属性:

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>


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

如果把这三者弄清楚了,多对多是很好理解的
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hibernate java 多对多