12.Hibernate多对多关系
JavaBean的编写
Person
private long pid ;
private String name ; private Set<Role> roles = new HashSet<Role>();
//省略get/set/无参构造
Role
private long rid ;
private String name ; private Set<Person> persons = new HashSet<Person>();
//省略get/set/无参构造
配置文件编写
person.hbm.xml(放弃外键维护,多对多必须有一方放弃外键维护)
<!-- table 表在数据库的名字 -->
<class name="com.hibernateday3.domain.Person" table="sys_person"> <id name="pid" column="pid">
<generator class="native"/>
</id> <property name="name" column="name"/> <!--
name:当前对象的集合
table:中间表的名字
column:当前对象在中间表的字段
class:集合对象的路径
column:集合对象在中间表的字段
-->
<set name="roles" table="sys_person_role">
<key column="pid"/>
<many-to-many class="com.hibernateday3.domain.Role" column="rid"/>
</set> </class>
role.hbm.xml
<!-- table 表在数据库的名字 -->
<class name="com.hibernateday3.domain.Role" table="sys_role"> <id name="rid" column="rid">
<generator class="native"/>
</id> <property name="name" column="name"/> <!--
name:当前对象的集合
table:中间表的名字
column:当前对象在中间表的字段
class:集合对象的路径
column:集合对象在中间表的字段
-->
<set name="persons" table="sys_person_role" inverse="true">
<key column="rid"/>
<many-to-many class="com.hibernateday3.domain.Person" column="pid"/>
</set> </class
核心文件中配置映射
<mapping resource="com/hibernateday3/domain/Person.hbm.xml"/>
<mapping resource="com/hibernateday3/domain/Role.hbm.xml"/>
测试:
1.双向保存
/**
* 测试多对多:双向保存
* 必须要有一份放弃维护外键
*/
@Test
public void m01(){ Session session = HibernateUtils.openSession();
Transaction tr = session.beginTransaction(); //创建对象
Person p1 = new Person();
p1.setName("人物一");
Person p2 = new Person();
p2.setName("人物二");
Role r1 = new Role();
r1.setName("角色1");
Role r2 = new Role();
r2.setName("角色1");
//-----------------保存数据 //人物一:角色1+角色2
p1.getRoles().add(r1);
p1.getRoles().add(r2);
r1.getPersons().add(p1);
r2.getPersons().add(p1); //人物二:角色1
p2.getRoles().add(r1);
r1.getPersons().add(p1); //保存
session.save(p1);
session.save(p2);
session.save(r1);
session.save(r2); //-----------------释放资源
tr.commit();
session.close();
}
2.级联保存(在没有放弃外键的一方添加cascsde)
Person.hbm.xml
<set name="roles" table="sys_person_role" cascade="save-update">
/**
* 测试多对多:级联保存保存
* 在没有放弃外键的一方添加cascsde
*/
@Test
public void m02(){ Session session = HibernateUtils.openSession();
Transaction tr = session.beginTransaction(); //创建对象
Person p1 = new Person();
p1.setName("人物一");
Person p2 = new Person();
p2.setName("人物二");
Role r1 = new Role();
r1.setName("角色1");
Role r2 = new Role();
r2.setName("角色1");
//-----------------保存数据 //人物一:角色1+角色2
p1.getRoles().add(r1);
p1.getRoles().add(r2); //人物二:角色1
p2.getRoles().add(r1); //保存
session.save(p1);
session.save(p2); //-----------------释放资源
tr.commit();
session.close();
}
3.让人物一失去角色1
/**
* 测试多对多:让人物一没有角色1
*
*/
@Test
public void m03(){ Session session = HibernateUtils.openSession();
Transaction tr = session.beginTransaction(); //-----------------获取数据
Person p1 = session.get(Person.class, 1l);
Role r1 = session.get(Role.class, 1l); //保存
p1.getRoles().remove(r1); //-----------------释放资源
tr.commit();
session.close();
}
在多对多中一般不使用级联删除
12.Hibernate多对多关系的更多相关文章
- Hibernate多对多关系映射(建表)
下边讲述Hibernate多对多关系映射. 多对多关系的表的结构为: 两个实体表,还包含一个关系表,关系表为复合主键,如果要使用Hibernate多对多关系映射,则关系表必须只包含两个字段,如果生成了 ...
- 菜鸟学习Hibernate——多对多关系映射
Hibernate中的关系映射,最常见的关系映射之一就是多对多关系映射例如用户与角色的关系,一个用户对应多个角色,一个角色对应多个用户.如图: Hibernate中如何来映射这两个的关系呢? 下面就为 ...
- hibernate 多对多关系总结
hibernate中,对对象关系的映射处理估计是最让人迷惑和头疼的,特别是cascade和inverse属性的使用,不知已经杀死了我多少个脑细胞了,好记性永远比不上烂笔头,为了能节省自己的脑细胞,降低 ...
- Hibernate多对多关系映射
两张表的多对多关系,在数据库中通常是通过第三张中间表来实现的,第三张中间表放的是两张表各自的主键值,通过主键与主键的对应来体现表直接的关系.比如在权限系统中,一个用户可以拥有多种权限,而一种权限也可以 ...
- hibernate多对多关系配置
一.创建用户,角色实体类. 一名用户可以有多个角色.一个角色可以对于多名用户. 用户实体类 public class User { private int uId; private String uN ...
- Java进阶知识12 Hibernate多对多双向关联(Annotation+XML实现)
1.Annotation 注解版 1.1.应用场景(Student-Teacher):当学生知道有哪些老师教,老师也知道自己教哪些学生时,可用双向关联 1.2.创建Teacher类和Student类 ...
- Hibernate 多对一关系中,在多的一方进行数据的插入
先看两个映射关系: 部门: <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//H ...
- hibernate多对多关系
package com.manytomany; import java.util.HashSet; import java.util.Set; public class Student { priva ...
- Hibernate学习第三天(2)(多对多关系映射)
1.1.1 Hibernate多对多关系的配置 1.1.1.1 创建表 l 用户表 CREATE TABLE `sys_user` ( `user_id` bigint(32) NO ...
随机推荐
- P5390 [Cnoi2019]数学作业
P5390 [Cnoi2019]数学作业求子集异或和的和拆成2进制,假设有x个数这一位为1,剩下n-x个数对答案没有贡献,对于这一位而言,对答案的贡献就是,x个数选奇数个数的方案数*2^(n-x).由 ...
- SpringCloudConfig
方便服务配置文件统一管理,实时更新 组成 在spring cloud config组件中,分两个角色,一是config server,二是config client Config Server是一个可 ...
- thinkphp扩展配置
扩展配置可以支持自动加载额外的自定义配置文件,并且配置格式和项目配置一样. 设置扩展配置的方式如下(多个文件用逗号分隔): // 加载扩展配置文件 'LOAD_EXT_CONFIG' => 'u ...
- python实现全局配置和用户配置文件
一.文件目录格式 二.代码 1.conf.__init__.py import importlib import os from conf import gsettings class Setting ...
- SQLServer 中存储过程
SQLServer 中存储过程返回的三种方式( 包括存储过程的创建, 在存储过程中调用, 在VS中调用的方法)存储过程有三种返回: 1. 用return返回数字型数据 2. 用返回参数 ...
- Spring Cloud Config的配置中心使用非对称性加密
首先,我们需要通过keytool工具来生成密钥对. keytool是JDK中的一个密钥和证书管理工具.它使用户能够管理自己的公钥/私钥对及相关证书,用于(通过数字签名)自我认证(用户向别的用户/服务认 ...
- day3:python测试题
1.Python的怎么单行注释和多行注释: 单行注释:# 多行注释: ''' ''' 或者 “”“ ”“” . 2.布尔值分别是什么 ? True /Fa ...
- 运算符的基本概念以及常用Scanner、随机数Random、选择结构的初步了解
运算符 分类 算术运算符 位运算符 关系运算符|比较运算符 逻辑运算符 条件运算符 赋值运算符 其中优先级顺序从上到下,可以记忆口诀:单目乘除位关系,逻辑三目后赋值 操作数: 运算符左右两边的数 表达 ...
- 1.关于Python的发展历史你知道吗?
1989,为了度过圣诞假期,Guido开始编写Python语言编译器.Python这个名字来自Guido的喜爱的电视连续剧<蒙蒂蟒蛇的飞行马戏团>.他希望新的语言Python能够满足他在C ...
- spring:bean的作用范围和生命周期
bean的作用范围调整: <!--bean的作用范围调整 bean标签的scope属性: 作用:用于指定bean的作用范围 取值:常用的就是单例的和多例的 singleton:单例的(默认值) ...