Hibernate多对多案例

  1.用户对角色

DROP TABLE IF EXISTS emp_role;
DROP TABLE IF EXISTS employee;
DROP TABLE IF EXISTS role; CREATE TABLE employee(
eid INT PRIMARY KEY AUTO_INCREMENT,
ename VARCHAR(20),
egender   CHAR(10),
ephone VARCHAR(30)
); CREATE TABLE role(
rtype INT PRIMARY KEY AUTO_INCREMENT,
rname VARCHAR(20)
); CREATE TABLE emp_role(
r_eid INT,
r_rtype INT, CONSTRAINT pk_r_eid_type PRIMARY KEY(r_eid,r_rtype),
CONSTRAINT fk_employee_emp_role FOREIGN KEY(r_eid) REFERENCES employee(eid),
CONSTRAINT fk_role_emp_role FOREIGN KEY(r_rtype) REFERENCES role(rtype)
);

Employee.hbm.xml

<!-- 配置多对多属性 -->
<!--
set标签:
name:关联的另一方的集合的属性名称
table:中间表的名称
-->
<set name="roles" table="emp_role" inverse="true">
<!--
key标签:
column:当前对象在中间表中的外键的名称
-->
<key column="r_eid"></key>
<!--
many-to-many标签:
class: 关联的另一方的类的全路径 -->
<many-to-many column="r_rtype" class="Role" ></many-to-many>
</set>

Role.hbm.xml

<!-- 配置多对多属性 -->
<set name="employees" table="emp_role" cascade="save-update">
<key column="r_rtype"></key>
<many-to-many column="r_eid" class="Employee" ></many-to-many>
</set>
/*
* new员工1个,new角色两个,角色给员工
*/
@Test
public void fun() {
Session session = HibernateUtils.getSession();
session.getTransaction().begin(); try {
Employee emp = new Employee();
emp.setEname("刘欢");
emp.setEgender("男");
emp.setEphone("15497863155"); Role role = new Role();
role.setRname("前台"); Role role1 = new Role();
role1.setRname("保洁"); role.getEmployees().add(emp);
role1.getEmployees().add(emp); session.save(role);
session.save(role1);
} catch (Exception e) {
session.getTransaction().rollback();
e.printStackTrace();
} session.getTransaction().commit();
session.close();
}

问题:Hibernate生成的SQL:不知道为什么还是会重复维护关系,我明明已经inverse="true"了, 如果我给role配置inverse不给employee配置inverse="true"的话,那根本就都放弃维护了,完全搞不懂,所以我就单纯让employee放弃维护,但是,还是重复维护关系了。而且,按理来说应该是被动方放弃维护关系,也就是说应该role方放弃维护,哎...脑瓜子疼

Hibernate:
    insert
    into
        role
        (rname)
    values
        (?)
Hibernate:
    insert
    into
        employee
        (ename, egender, ephone)
    values
        (?, ?, ?)
Hibernate:
    insert
    into
        role
        (rname)
    values
        (?)
Hibernate:
    insert
    into
        emp_role
        (r_rtype, r_eid)
    values
        (?, ?)
Hibernate:
    insert
    into
        emp_role
        (r_rtype, r_eid)
    values
        (?, ?)

 

 role的rtype会是4,5,是因为之前已经增删过几次数据了。

2.解除角色(这里就解除这个人的保洁角色把,5)

    /**
* 将id为1002127的员工的保洁身份去除
*/
@Test
public void fun2() {
Session session = HibernateUtils.getSession();
session.getTransaction().begin(); try {
Employee emp = session.get(Employee.class, 1002127);
Role role = session.get(Role.class, 5);
role.getEmployees().remove(emp);
} catch (Exception e) {
session.getTransaction().rollback();
e.printStackTrace();
} session.getTransaction().commit();
session.close();
}

Hibernate生成的SQL:

Hibernate:
    select
        employee0_.eid as eid1_2_0_,
        employee0_.ename as ename2_2_0_,
        employee0_.egender as egender3_2_0_,
        employee0_.ephone as ephone4_2_0_
    from
        employee employee0_
    where
        employee0_.eid=?
Hibernate:
    select
        role0_.rtype as rtype1_4_0_,
        role0_.rname as rname2_4_0_
    from
        role role0_
    where
        role0_.rtype=?
Hibernate:
    select
        employees0_.r_rtype as r_rtype1_1_0_,
        employees0_.r_eid as r_eid2_1_0_,
        employee1_.eid as eid1_2_1_,
        employee1_.ename as ename2_2_1_,
        employee1_.egender as egender3_2_1_,
        employee1_.ephone as ephone4_2_1_
    from
        emp_role employees0_
    inner join
        employee employee1_
            on employees0_.r_eid=employee1_.eid
    where
        employees0_.r_rtype=?
Hibernate:
    delete
    from
        emp_role
    where
        r_rtype=?

3.再给他添加一个角色把,把保洁的角色再次赋予给他

/**
* 给id为1002127的员工添加保洁的身份
*/
@Test
public void fun3() {
Session session = HibernateUtils.getSession();
session.getTransaction().begin(); try {
Employee emp = session.get(Employee.class, 1002127);
Role role = session.get(Role.class, 5);
role.getEmployees().add(emp);
} catch (Exception e) {
session.getTransaction().rollback();
e.printStackTrace();
} session.getTransaction().commit();
session.close();
}

Hibernate生成的SQL

Hibernate:
    select
        employee0_.eid as eid1_2_0_,
        employee0_.ename as ename2_2_0_,
        employee0_.egender as egender3_2_0_,
        employee0_.ephone as ephone4_2_0_
    from
        employee employee0_
    where
        employee0_.eid=?
Hibernate:
    select
        role0_.rtype as rtype1_4_0_,
        role0_.rname as rname2_4_0_
    from
        role role0_
    where
        role0_.rtype=?
Hibernate:
    select
        employees0_.r_rtype as r_rtype1_1_0_,
        employees0_.r_eid as r_eid2_1_0_,
        employee1_.eid as eid1_2_1_,
        employee1_.ename as ename2_2_1_,
        employee1_.egender as egender3_2_1_,
        employee1_.ephone as ephone4_2_1_
    from
        emp_role employees0_
    inner join
        employee employee1_
            on employees0_.r_eid=employee1_.eid
    where
        employees0_.r_rtype=?
Hibernate:
    insert
    into
        emp_role
        (r_rtype, r_eid)
    values
        (?, ?)

Hibernate入门(十一)多对多案例的更多相关文章

  1. Hibernate入门案例及增删改查

    一.Hibernate入门案例剖析: ①创建实体类Student 并重写toString方法 public class Student { private Integer sid; private I ...

  2. Hibernate入门案例 增删改

    一.Hibernate入门案例剖析: ①创建实体类Student 并重写toString方法 public class Student { private Integer sid; private I ...

  3. Hibernate(一)之Hibernate入门

    一.Hibernate入门 ssh框架体系结构 1.1.ORM框架 Hibernate是一个数据持久化层的ORM框架. Object:对象,java对象,此处特指JavaBean Relational ...

  4. 走进JavaWeb技术世界13:Hibernate入门经典与注解式开发

    原文地址:Hibernate入门这一篇就够了 前言 本博文主要讲解介绍Hibernate框架,ORM的概念和Hibernate入门,相信你们看了就会使用Hibernate了! 什么是Hibernate ...

  5. Hibernate入门4.核心技能

    Hibernate入门4.核心技能 20131128 代码下载 链接: http://pan.baidu.com/s/1Ccuup 密码: vqlv 前言: 前面学习了Hibernate3的基本知识, ...

  6. Hibernate入门这一篇就够了

    前言 本博文主要讲解介绍Hibernate框架,ORM的概念和Hibernate入门,相信你们看了就会使用Hibernate了! 什么是Hibernate框架? Hibernate是一种ORM框架,全 ...

  7. Hibernate入门_增删改查

    一.Hibernate入门案例剖析:  ①创建实体类Student 并重写toString方法 public class Student { private Integer sid; private ...

  8. hibernate关联关系(多对多)

    数据库的多对多数据库中不能直接映射多对多 处理:创建一个桥接表(中间表),将一个多对多关系转换成两个一对多 注:数据库多表联接查询 永远就是二个表的联接查询 注2:交叉连接 注3:外连接:left(左 ...

  9. 三大框架之hibernate入门

    hibernate入门   1.orm      hibernate是一个经典的开源的orm[数据访问中间件]框架           ORM( Object Relation Mapping)对象关 ...

随机推荐

  1. pycharm激活码

    MTW881U3Z5-eyJsaWNlbnNlSWQiOiJNVFc4ODFVM1o1IiwibGljZW5zZWVOYW1lIjoiTnNzIEltIiwiYXNzaWduZWVOYW1lIjoiI ...

  2. Android 9.0/P 版本推荐使用 HttpURLConnection

    早在几年前,谷歌就推荐在Android2.3版本以上使用HttpURLConnection,而在即将正式发布的 Android P 版本中,谷歌彻底取消了对Apache HTTPClient的支持,针 ...

  3. FFmpeg Android 学习(一):Android 如何调用 FFMPEG 编辑音视频

    一.概述 在Android开发中,我们对一些音视频的处理比较无力,特别是编辑音视频这部分.而且在Android上对视频编辑方面,几乎没有任何API做支持,MediaCodec(硬编码)也没有做支持.那 ...

  4. 7.数据库、Contentobserver

    群组页是程序内部维护的一个数据库,其中一张表groups,用于存放创建的群组,还有一张表thread_group,用于关联群组和系统短信数据库中的会话. 数据库应该这样设计 MySqliteHelpe ...

  5. JSP内置对象的使用(一)

    JSP九大内置对象是:request.response.session.application.out.pagecontext.config.page.exception. JSP常用的内置对象是:o ...

  6. flash中调用XML遇到的中文显示异常问题

    昨天使用flash调用XML文件进行显示时,出现了中文无法显示的问题,记录一下解决方法: 1.字体设置: 一般flash里的动态文本和嵌入文本都是默认的使用Arial字体,这个字体里可能没有中文,所以 ...

  7. Python中的算数运算

    算数运算符 计算机,顾名思义就是负责进行 数学计算 并且 存储计算结果 的电子设备 目标 算术运算符的基本使用 01. 算数运算符 算数运算符是 运算符的一种 是完成基本的算术运算使用的符号,用来处理 ...

  8. 【PHP篇】面向对象基础

    1.声明:class 类名{ //成员属性(变量) 修饰符 $变量名=初值: //成员方法(函数) 修饰符 function 函数名(){ 执行:} } 2.生成类对象:$对象名=new 类名():/ ...

  9. Git基本命令 -- 历史

    历史. 收先需要了解一下git log命令, 使用git的帮助看看: git help log: 执行该命令后, 我的win10弹出来一个html页面, 里面是git log命令的帮助: 首先看看gi ...

  10. Retrofit2 完全解析 探索与okhttp之间的关系

    转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/51304204: 本文出自:[张鸿洋的博客] 之前写了个okhttputils的 ...