Hibernate入门(十一)多对多案例
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入门(十一)多对多案例的更多相关文章
- Hibernate入门案例及增删改查
一.Hibernate入门案例剖析: ①创建实体类Student 并重写toString方法 public class Student { private Integer sid; private I ...
- Hibernate入门案例 增删改
一.Hibernate入门案例剖析: ①创建实体类Student 并重写toString方法 public class Student { private Integer sid; private I ...
- Hibernate(一)之Hibernate入门
一.Hibernate入门 ssh框架体系结构 1.1.ORM框架 Hibernate是一个数据持久化层的ORM框架. Object:对象,java对象,此处特指JavaBean Relational ...
- 走进JavaWeb技术世界13:Hibernate入门经典与注解式开发
原文地址:Hibernate入门这一篇就够了 前言 本博文主要讲解介绍Hibernate框架,ORM的概念和Hibernate入门,相信你们看了就会使用Hibernate了! 什么是Hibernate ...
- Hibernate入门4.核心技能
Hibernate入门4.核心技能 20131128 代码下载 链接: http://pan.baidu.com/s/1Ccuup 密码: vqlv 前言: 前面学习了Hibernate3的基本知识, ...
- Hibernate入门这一篇就够了
前言 本博文主要讲解介绍Hibernate框架,ORM的概念和Hibernate入门,相信你们看了就会使用Hibernate了! 什么是Hibernate框架? Hibernate是一种ORM框架,全 ...
- Hibernate入门_增删改查
一.Hibernate入门案例剖析: ①创建实体类Student 并重写toString方法 public class Student { private Integer sid; private ...
- hibernate关联关系(多对多)
数据库的多对多数据库中不能直接映射多对多 处理:创建一个桥接表(中间表),将一个多对多关系转换成两个一对多 注:数据库多表联接查询 永远就是二个表的联接查询 注2:交叉连接 注3:外连接:left(左 ...
- 三大框架之hibernate入门
hibernate入门 1.orm hibernate是一个经典的开源的orm[数据访问中间件]框架 ORM( Object Relation Mapping)对象关 ...
随机推荐
- dubbo 源码学习1 服务发布机制
1.源码版本:2.6.1 源码demo中采用的是xml式的发布方式,在dubbo的 DubboNamespaceHandler 中定义了Spring Framework 的扩展标签,即 <dub ...
- [转]Ubuntu Precise - Install youtube-dl package using Quantal repo
Ubuntu Precise - Install youtube-dl package using Quantal repo Ubuntu Precise 12.04 currently contai ...
- Java的简单类型不能够精确的对浮点数进行运算
由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精确的浮点数运算,包括加减乘除和四舍五入. import java.math.BigDecimal; /** * 由于Java的简单类 ...
- mysql5.5 五种日期
mysql(5.5)所支持的日期时间类型有:DATETIME. TIMESTAMP.DATE.TIME.YEAR. 几种类型比较如下: 日期时间类型 占用空间 日期格式 最小值 最大值 零值表示 D ...
- 组合拳出击-Self型XSS变废为宝
前言 作者:米斯特安全攻防实验室-Vulkey_Chen 博客:gh0st.cn 这是一个鸡肋性质的研究,也许有些标题党,请见谅- 本文启发于一些讨论,和自己脑子里冒出来的想法. 组合拳搭配 Self ...
- 虚拟机安装mysql
安装mysql8.0方法: 1.首先,ubuntu安装mysql8.0(此版本比较好装),所以要先更新一下源,去MySQL官网http://dev.mysql.com/downloads/repo/ ...
- Android7.0适配APK安装
Android7.0适配APK安装 适配的原因 对于面向Android7.0的应用,Android框架执行的StrictMode API政策禁止在您的应用外部公开file://URL.如果一项包含文件 ...
- 吴恩达机器学习笔记3-代价函数II(cost function)
本节学习内容:通过使得θ = 0从而简化代价函数来初步了解代价函数的特性及作用原理.
- Python (time、datetime、random、os、sys、shutil)模块的使用
######################################################### 模块time ################################### ...
- Debian/Ubuntu清理硬盘空间的8个技巧
1. 删除残余的配置文件 通常Debian/Ubuntu删除软件包可以用两条命令 sudo apt-get remove <package-name> sudo apt-get purge ...