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)对象关 ...
随机推荐
- day_9内存管理
复习 '''文件处理1.操作文件的三步骤 -- 打开文件:硬盘的空间被操作系统持有 | 文件对象被应用程序持续 -- 操作文件:读写操作 -- 释放文件:释放操作系统对硬盘空间的持有 2.基础的读写 ...
- 手动模拟attach cinder volume的过程
我们首先启动一台机器,启动的时候attach一个volume 创建一个空的cinder volume root:~# cinder create --display-name emptyvolume1 ...
- Openvswitch手册(7): Interfaces
我们来看Interfaces ofport: OpenFlow port number for this interface. type: system: An ordinary network de ...
- 福州首届.NET开源社区技术交流会圆满成功
活动总结 2018年11月10日周六的下午,在福州蒲公英创新工场举办了福州首届.NET开源社区技术交流会,来自福建省各大科技公司的技术小伙伴齐聚一堂,为了就是能在现场学习到微软跨平台技术.NET Co ...
- Java虚拟机:内存分配策略
版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! Java中提倡的自动内存管理机制最终可以归结为自动化的解决两个问题:给对象分配内存和回收分配给对象的内存.在之前的博客中已经详细讲解了内存 ...
- 使用Nginx+Uwsgi部署Python Flask项目
第一次用Flask做Web(也是第一次用Python做Web),在部署的时候遇到了不少问题,现在将过程就下来,供在这方面也有疑惑的人参考.(PS:使用Apache+mod_wsgi部署模式的可以参考另 ...
- 给你的WordPress站点添加下雪特效
今天看到这个教程,感觉挺应景的,就自己尝试了下,效果还行,没截GIF图 方法: 该js文件已支持https,同时已将其及相关雪花图片进行CDN加速处理,可直接调用. 找到WordPress主题的foo ...
- Python多线程使用和注意事项
多线程 基本实现: 第一种,函数方式 # -*- coding:utf-8 -*- import thread import time def print_time(threadName, ...
- 基于C++Qt4开发的白鸽局域网聊天器
开源项目Github链接:https://github.com/u014427391/chitchat1.0 欢迎star (1)群聊主界面,有工具栏,工具栏功能分别是发送文件.打开音乐播放器.保存聊 ...
- Static了解和复习继承。
Static了解 static加在局部变量的前面改变其存储类型使之成为静态局部变量,会延长它的生存周期,但是不会改变其作用域. 静态成员是属于类的,而不是属于某个对象的.即便没有任何一个实例,类的静态 ...