Hibernate 多对多关联映射配置

来源:互联网 发布:js 鼠标滑过div手型 编辑:程序博客网 时间:2024/05/29 19:10

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

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>




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

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




原创粉丝点击