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 ...
随机推荐
- postman在有登录认证的情况下进行接口测试!!!
1.启动自己的项目之后直接使用浏览器进行登录,登陆之后随意点击一个请求,F12找到该请求中请求头的Cookie键值对. 2.将该键值对复制粘贴到postman中的请求Headers中,如下图. 3,请 ...
- 蛮好用的Gungho重点工作督查督办跟踪管理系统
重点工作督查督办跟踪管理系统可以实现: 为了确保上级重要决定.指示和本单位重大目标和工作部署及时落到实处,确定实效,提升办事效率. 重点工作督查督办事项包括: 1)上级单位或领导的批示指示: 2)公司 ...
- 【JZOJ6384】珂学家
description analysis 注意配出来的饮料不可以再配成其他饮料,所以肯定有\(O(n^2)\)的枚举 而且可口度两两互不相同,搞得我以为这是神仙题 考虑把两个试剂\([l_1,r_1] ...
- 廖雪峰Java15JDBC编程-3JDBC接口-5JDBC连接池
1. JDBC连接池 1.1 JDBC连接池简介 线程池可以复用一个线程,这样大量的小任务通过线程池的线程执行,就可以避免反复创建线程带来的开销. 同样JDBC可以复用一个JDBC连接 JDBC的连接 ...
- poj 1742 Coins(二进制优化多重背包)
传送门 解题思路 多重背包,二进制优化.就是把每个物品拆分成一堆连续的\(2\)的幂加起来的形式,然后把最后剩下的也当成一个元素.直接类似\(0/1\)背包的跑就行了,时间复杂度\(O(nmlogc) ...
- SpringBoot-application:application.yml/配置文件详解
ylbtech-SpringBoot-application:application.yml/配置文件详解 springboot采纳了建立生产就绪spring应用程序的观点. Spring Boot优 ...
- UVA 12412 A Typical Homework (a.k.a Shi Xiong Bang Bang Mang)
题目链接:https://vjudge.net/problem/UVA-12412 题目大意 略. 分析 比较大规模的模拟,注意输入输出,浮点数精度,还有排名相同的输出顺序,还有一些边界情况处理. 代 ...
- day 81 Vue学习二之vue结合项目简单使用、this指向问题
Vue学习二之vue结合项目简单使用.this指向问题 本节目录 一 阶段性项目流程梳理 二 vue切换图片 三 vue中使用ajax 四 vue实现音乐播放器 五 vue的计算属性和监听器 六 ...
- ajax跨域请求使用代理
public class ProxyHandler extends HttpServlet { private static final long serialVersionUID = 1L; ...
- service资源
service的作用:帮助外界用户访问k8s内的服务,并且提供负载均衡 创建一个service vim k8s_svc.yml apiVersion: v1 kind: Service metadat ...