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: ...
随机推荐
- IE浏览器中判断IE版本
<!--[if !IE]><!--> 除IE外都可识别 <!--<![endif]--><!--[if IE]> 所有的IE可识别 <![e ...
- JavaScript设计模式(策略模式)
策略模式的定义是:定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换.将不变的部分和变化的部分隔开是每个设计模式的主题,策略模式也不例外,策略模式的目的就是将算法的使用与算法的实现分离开来 ...
- 解决maven依赖包下载慢的问题
修改maven 目录下setting.xml配置文件 在mirrors中添加如下配置即可 <mirror> <id>alimaven</id> <name&g ...
- Fix Scheduled Task Won’t Run for .BAT File
Step 1: Check File/Folder Permissions The first step to fixing this issue is ensuring that the accou ...
- Python(八) —— 异常(概念、捕获、传递、抛出)
异常的概念 捕获异常 异常的传递 抛出异常 异常的概念 程序在运行时,如果 Python 解释器 遇到 到一个错误,会停止程序的执行,并且提示一些错误信息,这就是 异常 程序停止执行并且提示错误信息 ...
- gperftools cpp wrapper
gperftools cpp wrapper // Compile command : ${CXX} -o test_profiler.elf -DUSE_GPERFTOOLS -DDEBUG -D_ ...
- 异常-Throwable的几个常见方法
package cn.itcast_04; import java.text.ParseException; import java.text.SimpleDateFormat; import jav ...
- Yali7月集训Contest2 T1 Cube 题解
题目链接: 连我们都只有纸质题目...话说雅礼集训都是这样的吗... 大意 0维基本图形是一个点 1维基本图形是一条线段 2维基本图形是一个正方形 3维基本图形是一个正方体 4维基本图形是... 求\ ...
- MySQL学习笔记:count(1)、count(*)、count(字段)的区别
关于数据库中行数统计,无论是MySQL还是Oracle,都有一个函数可以使用,那就是COUNT. 但是,就是这个常用的COUNT函数,却暗藏着很多玄机,尤其是在面试的时候,一不小心就会被虐.不信的话请 ...
- webpack初体验_集成插件_集成loader
webpack初体验 如果没装 webpack 就先装一下,命令行输入npm i webpack -g 新建一个项目 创建一个空的项目 定义一个名称 创建一个Module 选择静态 web 输入名称 ...