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)对象关 ...
随机推荐
- 【红色警报】XXE 高危漏洞将大面积影响微信支付安全,可能导致系统沦陷,请升级你的系统!
今天,微信支付发布了一则紧急通知: 尊敬的微信支付商户: 您的系统在接受微信支付XML格式的商户回调通知(支付成功通知.退款成功通知.委托代扣签约/解约/扣款通知.车主解约通知)时,如未正确地进行安全 ...
- Android开发 - 掌握ConstraintLayout(九)分组(Group)
使用ConstraintLayout后我们的布局是没有层级关系的,各个View之间都是平级关系,但是如果根据某个业务条件来控制多个View的显示与否,我们需要分别对每个View进行控制,需要调用多次s ...
- genymotion常见问题解答
[转]常见问题解答 很多人喜欢使用Genymotion这款安卓模拟器,但是虽然Genymotion很好用,可是却有各种问题存在哦,下面潇潇就一些常见的Genymotion问题来说下解决方法吧. 为什么 ...
- 微信小程序高级基础
微信小程序高级基础 微信小程序的注册和服务器配置: 小程序是什么呢?小程序是一种不需要下载安装就可以使用的应用,它实现了应用"触手可及"的梦想,用户扫一扫或者搜一下就可以打开应用, ...
- jsp进阶
Jsp,前段的数据读取到后端 获取前段输入框数据 request.getParameter(前段输入框的name值) Request.代表转发,(代码在服务器内部执行的一次性请求,url地址不会发生改 ...
- 认识jsp
jsp头部指令 <%@page import="com.offcn.utils.PageUtils"%> <%@ taglib uri="http:/ ...
- HBase相关的一些点
1.在运行Hbase时,如果遇到出错之后: 可以通过{HBASE_HOME}目录,我的是在/usr/soft/hbase下的logs子目录中的日志文件查看错误原因.2.启动关闭Hadoop和HBase ...
- Ubuntu 16.04 下octave的使用入门
SciLab和octave是开源的且免费的矩阵计算工具,二者都有希望成为矩阵计算的新宠.相比之下, octave与MatLab的兼容性更高. octave遵循GPL协议(GNU General Pub ...
- iOS学习——(转)NSObject详解
本文主要转载自:ios开发 之 NSObject详解 NSObject是大部分Objective-C类继承体系的根类.这个类遵循NSObject协议,提供了一些通用的方法,对象通过继承NSObject ...
- Maven 概要介绍
Maven 简介 Apache Maven 是一套软件工程管理和整合工具.基于工程对象模型(POM)的概念,通过一个中央信息管理模块,Maven 能够管理项目的构建.报告和文档. Maven 工程结构 ...