1.插入
建一个部门类Dept和一个员工类Emp;
Emp对Dept是多对一的关系;因为一个部门有多个员工,而一个员工只有一个部门;
Emp类中添加一个Dept的属性;
@ManyToOne注解表示了员工和部门是多对一的关系;
@JoinColumn注解的name属性表示外键名;Emp表中会多出一个外键列;
//多对一,一个员工对应一个部门;而一个部门可对应多个员工;
@JoinColumn(name="d_id")
@ManyToOne
private Dept dept;
插入测试:
//测试多对一添加
@Test
public void testUpdate() {
//部门1
Dept dept=new Dept();
dept.setDname("军师");
//员工1
Emp emp=new Emp();
emp.setBirthday(new Date());
emp.setName("诸葛孔明");
emp.setSalary(1000);
emp.setDept(dept);
//员工2
Emp emp2=new Emp();
emp2.setBirthday(new Date());
emp2.setName("小懿子");
emp2.setSalary(5000);
emp2.setDept(dept);
//插入
manager.persist(dept);
manager.persist(emp);
manager.persist(emp2);
}
结果:
Hibernate:
insert
into
tb_dept
(dname)
values
(?)
Hibernate:
insert
into
tb_emp
(birthday, d_id, name, salary)
values
(?, ?, ?, ?)
Hibernate:
insert
into
tb_emp
(birthday, d_id, name, salary)
values
(?, ?, ?, ?)
可以看出,先插入Dept也就是少的一方,执行三条insert语句;
先插入Emp,后插入Dept结果:
Hibernate:
insert
into
tb_emp
(birthday, d_id, name, salary)
values
(?, ?, ?, ?)
Hibernate:
insert
into
tb_emp
(birthday, d_id, name, salary)
values
(?, ?, ?, ?)
Hibernate:
insert
into
tb_dept
(dname)
values
(?)
Hibernate:
update
tb_emp
set
birthday=?,
d_id=?,
name=?,
salary=?
where
id=?
Hibernate:
update
tb_emp
set
birthday=?,
d_id=?,
name=?,
salary=?
where
id=?
可以看出,先执行了三条插入语句,后执行了两条update语句;
因为Emp先插入时由于Dept还没插入,所以没有Dept的did;也就是外键;
等Dept插入后有了外键;
为了维持两张表的关联关系,执行了更新语句;给两个Emp添加外键;
为了提高效率,处理多对一的保存操作时,最好先保存少的一方;
2.查询
@Test
public void testSelect(){
manager.find(Emp.class, 1);
}
结果:
Hibernate:
select
emp0_.id as id1_1_1_,
emp0_.birthday as birthday2_1_1_,
emp0_.d_id as d_id5_1_1_,
emp0_.name as name3_1_1_,
emp0_.salary as salary4_1_1_,
dept1_.did as did1_0_0_,
dept1_.dname as dname2_0_0_
from
tb_emp emp0_
left outer join
tb_dept dept1_
on emp0_.d_id=dept1_.did
where
emp0_.id=?
可以看出使用左外连接来获取关联对象;
1)懒加载查询
可在@ManyToOne注解后面将fetch属性改为LAZY来使用懒加载;
懒加载会在需要用到Dept的属性时才执行查询Dept的sql语句;可以节省资源;
//多对一,一个员工对应一个部门;而一个部门可对应多个员工;
@JoinColumn(name="d_id")
@ManyToOne(fetch=FetchType.LAZY)
private Dept dept;
结果:
Hibernate:
select
emp0_.id as id1_1_0_,
emp0_.birthday as birthday2_1_0_,
emp0_.d_id as d_id5_1_0_,
emp0_.name as name3_1_0_,
emp0_.salary as salary4_1_0_
from
tb_emp emp0_
where
emp0_.id=?
可以看出没有查询外键;
3.删除
因为有外键关联;在删除多对一,少的一方时会报错;
例如当Dept的一条记录还被Emp中的记录关联时,就无法删除,会报错;
4.更新
在many to one 映射中,可以通过one的一方来修改many;
//测试修改
@Test
public void testUpdate(){
Emp emp=manager.find(Emp.class, 1);
emp.getDept().setDname("丞相");
}
结果:
Hibernate:
select
emp0_.id as id1_1_0_,
emp0_.birthday as birthday2_1_0_,
emp0_.d_id as d_id5_1_0_,
emp0_.name as name3_1_0_,
emp0_.salary as salary4_1_0_
from
tb_emp emp0_
where
emp0_.id=?
Hibernate:
select
dept0_.did as did1_0_0_,
dept0_.dname as dname2_0_0_
from
tb_dept dept0_
where
dept0_.did=?
Hibernate:
update
tb_dept
set
dname=?
where
did=?
可以看出执行了两条查询语句和一条更新语句;
- JPA实体关系映射:@ManyToMany多对多关系、@OneToMany@ManyToOne一对多多对一关系和@OneToOne的深度实例解析
JPA实体关系映射:@ManyToMany多对多关系.@OneToMany@ManyToOne一对多多对一关系和@OneToOne的深度实例解析 今天程序中遇到的错误一 org.hibernate.A ...
- hibernate笔记--单(双)向的多对多映射关系
在讲单向的多对多的映射关系的案例时,我们假设我们有两张表,一张角色表Role,一张权限表Function,我们知道一个角色或者说一个用户,可能有多个操作权限,而一种操作权限同时被多个用户所拥有,假如我 ...
- 【Mybatis高级映射】一对一映射、一对多映射、多对多映射
前言 当我们学习heribnate的时候,也就是SSH框架的网上商城的时候,我们就学习过它对应的高级映射,一对一映射,一对多映射,多对多映射.对于SSM的Mybatis来说,肯定也是差不多的.既然开了 ...
- mybatis入门_一对多,多对多映射以及整合spring框架
一.一对多映射. 1.1 一对多映射之根据多的一方关联查询一的一方 示例:查询出具体的订单信息,同时也查询出来订单的用户信息. 引入的订单表如下所示: 框选出来的为具体的外键. 订单的Pojo类如下所 ...
- hibernate(四) 双向多对多映射关系
序言 莫名长了几颗痘,真TM疼,可能是现在运动太少了,天天对着电脑,决定了,今天下午花两小时去跑步了, 现在继上一章节的一对多的映射关系讲解后,今天来讲讲多对多的映射关系把,明白了一对多,多对多个人感 ...
- hibernate(七)组件映射与多对一映射
一.组件映射 用注解配置组件映射: Husband为我们映射的类,wife是这个类的一部分(属性不能与husband中属性重名,不要写Entity注解,不要有主键) Husband类:(在getWif ...
- Hibernate中的一对多与多对一映射
1.需求 一个部门有多个员工; [一对多] 多个员工,属于一个部门 [多对一] 2.实体Bean设计 Dept: public class Dept { private int ...
- JPA实体继承映射
注意:据说,在本文所指的实体是@Entity注解的类. JPA在对象 - 关系映射通常情况下一个实体对应表,不管是什么这两个实体之间的关系.假设两个实体之间的继承关系.那么它是如何映射? JPA实体支 ...
- Hibernate之关联映射(一对多和多对一映射,多对多映射)
~~~接着之前的Hibernate框架接着学习(上篇面试过后发现真的需要学习以下框架了,不然又被忽悠让去培训.)~~~ 1:Hibernate的关联映射,存在一对多和多对一映射,多对多映射: 1.1: ...
随机推荐
- SpringBoot起飞系列-自定义starter(十)
一.前言 到现在,我们可以看出来,如果我们想用一些功能,基本上都是通过添加spring-boot-starter的方式来使用的,因为各种各样的功能都被封装成了starter,然后把相关服务注入到容器中 ...
- Java笔记1: 输入输出与变量常量
输入方法 nextLine 以Enter为结束符,也就是说 nextLine()方法返回的是输入回车之前的所有字符. 可以获得空白的一串字符. import java.util.Scanner; pu ...
- 对CSRF(跨站请求伪造)的理解
一.什么是CSRF? CSRF是Cross Site Request Forgery的缩写,翻译过来就是跨站请求伪造.那么什么是跨站请求伪造呢?让我一个词一个词的解释: 1.跨站:顾名思义,就是从一个 ...
- tr、od命令
一.tr:替换或删除字符 语法: tr [OPTION] ... SET1 [SET2] 描述 翻译,压缩和/或删除标准输入中的字符,可写吗? 到标准输出. -c, ...
- 简单说说utf-8编码格式
提到utf-8,脑海里立马出现了Unicode.那什么是utf-8, 什么是Unicode呢?简要说一下. Unicode(Universal Multiple-Octet Coded Charact ...
- 怎样使用 v-bind 绑定 html 标签的属性值?
1. 在 Vue 中可是使用 v-bind 对 html 中的 属性 进行绑定, 如下所示, 我们想给这个 a 标签绑定一个 title 值: <!DOCTYPE html> <ht ...
- WCF寄宿windows服务一
如果只是寄宿单个wcf服务,方法很简单,步骤:1.创建好一个windows服务.关于windows服务内容见:http://www.cnblogs.com/zhaow/p/7866916.html2. ...
- 爱上Java诊断利器之Arthas
1. Arthas是什么? 摘自Arthas的Github介绍: Arthas is a Java Diagnostic tool open sourced by Alibaba. Arthas al ...
- 巧用Map缓存提升"翻译"速度
在业务编码中,很多情况都需要用到code2Name或者id2Name之间的"翻译",在我的过往经历中发现不少开发人员都是直接双重循环实现这种"翻译".如果一次& ...
- 操作MongoDB好用的图形化工具,Robomongo -> 下载 -> 安装
一 下载 点击下载 -> https://robomongo.org/download 二 安装 直接下一步就行了 -> 择安装位置之后 -> 确认安装