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: ...
随机推荐
- java注解类型的aop
import java.lang.reflect.Method; import javax.servlet.http.HttpServletRequest; import org.aspectj.la ...
- 剑指offer4:重建二叉树(后序遍历)
1. 题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4 ...
- 从入门到自闭之Python--MySQL数据库的单表操作
单表查询:select * from 表 where 条件 group by 分组 having 过滤 order by 排序 limit n; 语法: select distinct 字段1,字段2 ...
- ale.js 对比其他框架
欢迎!我们相信你来这里的目的就是为了解 Ale 与其他大型框架的区别,这也正是我们想要在此回答的. 客观来说,作为 Ale 的核心开发者,我们肯定会更偏爱 Ale,认为对于某些问题来讲用 Ale 解决 ...
- RHEL8配置本地yum源
在RHEL8中把软件源分成了两部分一个是BaseOS,一个是AppStream. 在Red Hat Enterprise Linux 8.0中,统一的ISO自动加载BaseOS和AppStream安装 ...
- 11-Perl 运算符
1.Perl 运算符运算符是一种告诉编译器执行特定的数学或逻辑操作的符号,如: 3+2=5.Perl 语言内置了丰富的运算符,我们来看下常用的几种: 算术运算符,比较运算符,逻辑运算符,赋值运算符,位 ...
- Centos7:Redis3.0集群搭建
Redis集群中至少应该有三个节点.要保证集群的高可用,需要每个节点有一个备份机.Redis集群至少需要6台服务器. 搭建伪分布式.可以使用一台虚拟机运行6个redis实例. 修改redis的端口号7 ...
- javascript头像上传
上传头像: 相关关键词:ondragover(拖动元素在投放区内移动) ondrop (元素放在投放区触发但是要去处理浏览器默认事件的影响:ondragenter.ondragover) dataTr ...
- vue移动端出现遮罩层时在遮罩层滑动时禁止遮罩层下方页面滑动
h5页面 点击出现弹框时 在遮罩层上面滑动时 下方的页面会出现滑动现象 解决方法 我知道的有以下两种 在遮罩层标签上添加@touchmove.prevent 把遮罩层显示时把下方的父盒子css设置为固 ...
- vue防重复点击(指令实现)
快速点击按钮会重复多次调用接口,防止出现这样的情况 全局定义,方便调用 新建plugins.js export default { install (Vue) { // 防重复点击(指令实现) Vue ...