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多对一映射的更多相关文章

  1. JPA实体关系映射:@ManyToMany多对多关系、@OneToMany@ManyToOne一对多多对一关系和@OneToOne的深度实例解析

    JPA实体关系映射:@ManyToMany多对多关系.@OneToMany@ManyToOne一对多多对一关系和@OneToOne的深度实例解析 今天程序中遇到的错误一 org.hibernate.A ...

  2. hibernate笔记--单(双)向的多对多映射关系

    在讲单向的多对多的映射关系的案例时,我们假设我们有两张表,一张角色表Role,一张权限表Function,我们知道一个角色或者说一个用户,可能有多个操作权限,而一种操作权限同时被多个用户所拥有,假如我 ...

  3. 【Mybatis高级映射】一对一映射、一对多映射、多对多映射

    前言 当我们学习heribnate的时候,也就是SSH框架的网上商城的时候,我们就学习过它对应的高级映射,一对一映射,一对多映射,多对多映射.对于SSM的Mybatis来说,肯定也是差不多的.既然开了 ...

  4. mybatis入门_一对多,多对多映射以及整合spring框架

    一.一对多映射. 1.1 一对多映射之根据多的一方关联查询一的一方 示例:查询出具体的订单信息,同时也查询出来订单的用户信息. 引入的订单表如下所示: 框选出来的为具体的外键. 订单的Pojo类如下所 ...

  5. hibernate(四) 双向多对多映射关系

    序言 莫名长了几颗痘,真TM疼,可能是现在运动太少了,天天对着电脑,决定了,今天下午花两小时去跑步了, 现在继上一章节的一对多的映射关系讲解后,今天来讲讲多对多的映射关系把,明白了一对多,多对多个人感 ...

  6. hibernate(七)组件映射与多对一映射

    一.组件映射 用注解配置组件映射: Husband为我们映射的类,wife是这个类的一部分(属性不能与husband中属性重名,不要写Entity注解,不要有主键) Husband类:(在getWif ...

  7. Hibernate中的一对多与多对一映射

    1.需求 一个部门有多个员工;         [一对多] 多个员工,属于一个部门    [多对一] 2.实体Bean设计 Dept: public class Dept { private int ...

  8. JPA实体继承映射

    注意:据说,在本文所指的实体是@Entity注解的类. JPA在对象 - 关系映射通常情况下一个实体对应表,不管是什么这两个实体之间的关系.假设两个实体之间的继承关系.那么它是如何映射? JPA实体支 ...

  9. Hibernate之关联映射(一对多和多对一映射,多对多映射)

    ~~~接着之前的Hibernate框架接着学习(上篇面试过后发现真的需要学习以下框架了,不然又被忽悠让去培训.)~~~ 1:Hibernate的关联映射,存在一对多和多对一映射,多对多映射: 1.1: ...

随机推荐

  1. Adaboost推导

    AdaBoost算法推导过程: https://www.jianshu.com/p/0d850d85dcbd

  2. go 拼接sql

    //原文链接:https://www.jianshu.com/p/a0569157c418 golang mysql拼接子查询 使用fmt.Sprintf拼接SQL 实例代码 func Select( ...

  3. Katu Puzzle POJ - 3678 (2 - sat)

    有N个变量X1X1~XNXN,每个变量的可能取值为0或1. 给定M个算式,每个算式形如 XaopXb=cXaopXb=c,其中 a,b 是变量编号,c 是数字0或1,op 是 and,or,xor 三 ...

  4. django 项目开发及部署遇到的坑

    1.django 连接oracle数据库遇到的坑 需求:通过plsql建立的oracle数据表,想要django操作这几个表 python manage.py inspectdb table_name ...

  5. 不同主机的docker内容器通过直接路由的方式进行通信

    引用文章链接:https://www.cnblogs.com/xiao987334176/p/10049844.html 六.操作总结 修改不同主机上docker默认的网络参数 主机1:192.168 ...

  6. 大数据测试类型&大数据测试步骤

    一.什么是大数据? 大数据是一个大的数据集合,通过传统的计算技术无法进行处理.这些数据集的测试需要使用各种工具.技术和框架进行处理.大数据涉及数据创建.存储.检索.分析,而且它在数量.多样性.速度方法 ...

  7. 通过Callable接口实现多线程

    一.通过Callable接口实现多线程 c.实现Callable重写call方法 实现Callable和实现Runnable类似,但是功能更强大,具体表现在 a.可以在任务结束后提供一个返回值,Run ...

  8. EF 将MSSQL 更换成 POSTRESQL

    前提概要:项目里已存在MSSQL 的 DB FIRST 的EDMX, 想将项目的数据库转换成 POSTGRESQL. 解决方法: 1,新建项目, 连接MSSQL 建立模型,用来源于数据库 CODE F ...

  9. C++ 新特性 笔记 2 右值引用

    C ++ Rvalue引用说明 以下内容,主要是上述链接的摘要 介绍 Rvalue引用是C ++的一个特性,它是随C ++ 11标准添加的.使右值参考有点难以理解的是,当你第一次看到它们时,不清楚它们 ...

  10. python常用模块:sys、os、path、setting、random、shutil

    今日内容讲了3个常用模块 一.sys模块二.os模块三.os下path模块四.random模块五.shutil模块 一.sys模块 import sys #环境变量 print(sys.path) # ...