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>
以上就是简单的多对多配置,这配置中主要要理解延迟加载,放弃外键维护和级联操作,
如果把这三者弄清楚了,多对多是很好理解的
阅读全文
0 0
- Hibernate 多对多关联映射配置
- Hibernate关联关系映射-----单向多对一映射配置
- Hibernate关联映射-----多对多关联
- Hibernate关联映射--多对一映射
- 【Hibernate框架】关联映射(多对多关联映射)
- Hibernate关联映射之一对多单向关联映射
- Hibernate关联映射之多对多单/双向关联映射
- Hibernate关联关系映射(多对一关联映射)
- Hibernate多对多双向关联映射
- Hibernate 关联映射 多对多
- hibernate关联映射中的多对多
- hibernate---->多对多关联映射
- Hibernate多对多关联映射
- Hibernate 映射多对多关联关系
- 【Hibernate】多对多关联映射
- Hibernate 映射多对多关联关系
- 【Hibernate】多对多关联映射
- Hibernate关联关系映射---多对多
- Zookeeper的集群配置和Java测试程序
- hdu 4738 Caocao's Bridges -有重边的无向图找桥
- 工作转正申请自我评价
- weex 中遇到的一些问题记录
- 分布式协调服务zookeeper 知多少
- Hibernate 多对多关联映射配置
- OneHot编码
- html的超链接,图像以及列表标签
- Jzoj4895 三部曲
- 蓝牙5.0发布(新特性速览)
- Struts2和Spring的整合代码截图
- 画家与黑客(语录)
- git 生成patch并打入主干
- python索引问题