Hibernate 多对多关联映射配置
2017-11-03 17:16
211 查看
再弄多对多之前先弄清楚三个属性:
lazy(延迟加载):在多对多中延迟加载是必须的,因为不管哪一方都是对应另一方的多个数据,如果不设置延迟加载会非常浪费内存
inverse(放弃外键维护权):在多对多中,双方没有主次分别,所以两边都会对中间表的外键进行维护,就会进行重复操作,
尤其在进行保存的时候,会进行重复主键的添加,就会报主键重复异常,所以在多对多中必须有一方要放弃外键维护权,
放弃原则:操作少的一方放弃外键维护
cascade(级联操作):在多对多中不能加delete级联删除,可以加save-update级联保存和更新
接下来直接看代码
以用户和角色为例:一个用户可以有多种角色,一个角色可以被多个用户所拥有
关键是关系配置文件中怎么写:
关系映射文件的约束:就是加在头上的
多对多主要配置信息
在关系配置文件中的所有的name都是指类的属性,column指定是对应表中的字段名
User.hbm.xml
Role.hbm.xml
以上就是简单的多对多配置,这配置中主要要理解延迟加载,放弃外键维护和级联操作,
如果把这三者弄清楚了,多对多是很好理解的
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一对一主键双向关联映射(xml配置)
- Hibernate 关联映射配置文件
- Hibernate实体关系关联映射中配置文件的编写
- Hibernate一对多关联映射的配置及其级联删除问题
- Hibernate多对多的关联映射(如何配置,代码实现)
- Hibernate复合主键作为外键在关联映射中的配置方法
- Hibernate数据关联映射之一对多和多对一配置
- Hibernate一对一关联映射配置
- Hibernate一对一关联映射配置
- Hibernate一对一关联映射配置
- Hibernate配置文件与关联映射介绍
- 在测试Hibernate的一对多双向关联映射时
- spring配置hibernate映射文件-------通配符
- Hibernate 关联映射
- Hibernate的关联映射---6.1.1: 单向n-1关联
- hibernate系列八:一对多关联配置及案例
- 【Hibernate步步为营】--关联映射之多对一
- 8 Hibernate:关联映射(Associations)
- Hibernate关联映射
- hibernate关联映射中的组件映射