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)对象关 ...
随机推荐
- arp脚本
1.什么是arp?arp可以解决什么问题? ARP:是地址解析协议 arp解决我们知道一个机器(主机或者路由器)的IP地址,需要找出其相应的硬件地址 2.编写ARP脚本,抓取对应主机的mac地址 1 ...
- 【红色警报】XXE 高危漏洞将大面积影响微信支付安全,可能导致系统沦陷,请升级你的系统!
今天,微信支付发布了一则紧急通知: 尊敬的微信支付商户: 您的系统在接受微信支付XML格式的商户回调通知(支付成功通知.退款成功通知.委托代扣签约/解约/扣款通知.车主解约通知)时,如未正确地进行安全 ...
- winform复制文件到指定目录
执行步骤 弹出选择对话框:var openFileDialog = new OpenFileDialog(); 设置选择内容,如所有图片:openFileDialog.Filter="图像文 ...
- 使用Python多渠道打包apk
使用Python生成多渠道包 往apk包中追加到一个空文件到META-INF目录以标识渠道,Android中获取此文件即可获得App的下载渠道 首先在info文件夹新建一个qdb.txt的空文本文件 ...
- 微信小程序实现标签页滑块效果
微信小程序实现标签页滑块效果 小程序完整代码: wxml: <view class="swiper-tab"> <view class="swiper- ...
- 远程桌面连接:出现身份验证错误,要求的函数不受支持,可能是由于CredSSP加密Oracle修正的解决方法
在做app时需要连接服务器来进行数据交互,但是在阿里云页面里连接服务器太不好用,所以使用windows自带的远程连接来进行. 一.但是连接的过程中出现了以下问题: 二.最初是有点迷茫的,不知道从哪里下 ...
- 产品经理聊产品--mac book pro 2018 初体验
工作前几年,使用电脑,基本上都是微软的操作系统,自从从大厂出来之后,才逐渐熟悉使用linux,到现在基本上都是基本上一个月windows平台基本不需要开机就可以,可以说基本上被ubuntu的简洁和实用 ...
- 【MML】华为MML AAA接口联调,Java版本
1.我们先设置一些常量数据 package cn.cutter.ztesoft.HuWeiMML.constrant; /** * @description: AAA接口常量设置 * @author: ...
- 多线程的音频打标记的python实现(原创)
技术难度: ①需要一个UI界面,并且其中可进行相关参数的自调,最开始使用的是pygame的框架,后来转用tk界面: ②需要可以播放音频文件,MP3.WMA等格式: ③需要在播放音频的同时进行打标签操作 ...
- React Native IOS搭建开发环境
安装 必须的软件 Homebrew ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/mast ...