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多对多关系的更多相关文章

  1. Hibernate多对多关系映射(建表)

    下边讲述Hibernate多对多关系映射. 多对多关系的表的结构为: 两个实体表,还包含一个关系表,关系表为复合主键,如果要使用Hibernate多对多关系映射,则关系表必须只包含两个字段,如果生成了 ...

  2. 菜鸟学习Hibernate——多对多关系映射

    Hibernate中的关系映射,最常见的关系映射之一就是多对多关系映射例如用户与角色的关系,一个用户对应多个角色,一个角色对应多个用户.如图: Hibernate中如何来映射这两个的关系呢? 下面就为 ...

  3. hibernate 多对多关系总结

    hibernate中,对对象关系的映射处理估计是最让人迷惑和头疼的,特别是cascade和inverse属性的使用,不知已经杀死了我多少个脑细胞了,好记性永远比不上烂笔头,为了能节省自己的脑细胞,降低 ...

  4. Hibernate多对多关系映射

    两张表的多对多关系,在数据库中通常是通过第三张中间表来实现的,第三张中间表放的是两张表各自的主键值,通过主键与主键的对应来体现表直接的关系.比如在权限系统中,一个用户可以拥有多种权限,而一种权限也可以 ...

  5. hibernate多对多关系配置

    一.创建用户,角色实体类. 一名用户可以有多个角色.一个角色可以对于多名用户. 用户实体类 public class User { private int uId; private String uN ...

  6. Java进阶知识12 Hibernate多对多双向关联(Annotation+XML实现)

    1.Annotation 注解版 1.1.应用场景(Student-Teacher):当学生知道有哪些老师教,老师也知道自己教哪些学生时,可用双向关联 1.2.创建Teacher类和Student类 ...

  7. Hibernate 多对一关系中,在多的一方进行数据的插入

    先看两个映射关系: 部门: <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//H ...

  8. hibernate多对多关系

    package com.manytomany; import java.util.HashSet; import java.util.Set; public class Student { priva ...

  9. Hibernate学习第三天(2)(多对多关系映射)

    1.1.1      Hibernate多对多关系的配置 1.1.1.1   创建表 l   用户表 CREATE TABLE `sys_user` ( `user_id` bigint(32) NO ...

随机推荐

  1. U Must Know The .Net --7

    关键字 1 new 创建对象/调用构造函数 隐藏基类成员 new()约束,表明泛型类声明中的任何参数都必须有公共无参构造函数 new 实现多态 1.1 new class:分配内存,调用构造函数实例化 ...

  2. [JZOJ4331] 【清华集训模拟】树

    题目 题目大意 给你一棵带点权的树,求将树变成一堆不相交的链,而且这些链的权值和非负的方案数. 正解 显然这道题是个\(DP\). 首先求个前缀和\(sum\). 为了后面讲述方便,我这样设:\(f_ ...

  3. TopCoder[SRM513 DIV 1]:PerfectMemory(500)

    Problem Statement      You might have played the game called Memoria. In this game, there is a board ...

  4. 暴力剪枝——cf1181C

    暴力求长度为len时,以i,j为左上角的旗子的数量 不剪枝的话复杂度是n*n*m*n,必定超时 两个可以剪枝的地方:如果格子[i,j]可以作为长度为len的旗子的左上角,那么其必定不可以作为长度> ...

  5. iOS开发系列-NSOutputStream

    NSOutputStream 创建一个NSOutputStream实例 - (nullable instancetype)initToFileAtPath:(NSString *)path appen ...

  6. printk 函数消息是如何记录的

    printk 函数将消息写入一个   LOG_BUF_LEN 字节长的环形缓存, 长度值从 4 KB 到 1 MB, 由配置内核时选择. 这个函数接着唤醒任何在等待消息的进程, 就是说, 任何在系统 ...

  7. 改变 HTML 样式 Object.style.property=new style;

    改变 HTML 样式 HTML DOM 允许 JavaScript 改变 HTML 元素的样式.如何改变 HTML 元素的样式呢? 语法: Object.style.property=new styl ...

  8. 【学术篇】状态压缩动态规划——POJ3254/洛谷1879 玉米田Corn Field

    我要开状压dp的坑了..直播从入门到放弃系列.. 那就先拿一道状压dp的水题练练手吧.. 然后就找到了这一道..这道题使我清醒地认识到阻碍我的不是算法,而是视力= = 传送门: poj:http:// ...

  9. 读《深入PHP 面向对象、模式与实践》笔记

    1. include() 和require() 语句的不同在于它们如何处理错误.使用require()调用文件发生错误时,将会停止整个程序;调用include()时遇到相同的错误,则会生成警告并停止执 ...

  10. soj98 卡牌

    题意:一共有n张牌,每张牌有三个属性ai,bi,ci.问在属性上限为A,B,C的所有牌中有多少张牌满足至少有两个属性可以完全压制(严格大于)那n张牌? n<=50W. 标程: #include& ...