单向一对多是一个类中的一条记录可对应另一个类的多条记录;
比如一个部门可对应多个员工;
 
jpa中的实现步骤:
    one-to-many的one类中添加一个many类类型的set;比如部门类Dept中添加一个员工类的Set<Emp>;
    在set属性上方添加注解@one-to-many,表示映射one-to-many关系;
    在set属性前添加注解@JoinColumn注解,注解的name属性为one类的主键,用来映射外键列名;
//一对多关联
     @JoinColumn(name="id")
     @OneToMany
     private Set<Emp> empSet;
  
1.插入
代码:
//测试一对多
     @Test
     public void testInsert(){
           Emp e1=new Emp();
           e1.setBirthday(new Date());
           e1.setName("诸葛村夫");
           e1.setSalary(2000);
           Emp e2=new Emp();
           e2.setBirthday(new Date());
           e2.setName("王司徒");
           e2.setSalary(5000);
           Dept dept=new Dept();
           dept.setDname("文官");
           Set set=new HashSet<Emp>();
           set.add(e1);
           set.add(e2);
           dept.setEmpSet(set);
           //执行保存操作
           manager.persist(e1);
           manager.persist(e2);
           manager.persist(dept);
     }
结果:
Hibernate:
    insert
    into
        tb_emp
        (birthday, name, salary)
    values
        (?, ?, ?)
Hibernate:
    insert
    into
        tb_emp
        (birthday, name, salary)
    values
        (?, ?, ?)
Hibernate:
    insert
    into
        tb_dept
        (dname)
    values
        (?)
Hibernate:
    update
        tb_emp
    set
        id=?
    where
        did=?
Hibernate:
    update
        tb_emp
    set
        id=?
    where
        did=?
可以看出,执行了三条插入语句和两条更新语句;
由于是one的一端通过外键来维持关联关系;
在保存many的一端时,就不会保存外键;
只能通过update语句来向many的一段插入外键;
因此无论先插入many还是先插入one都会有update语句;
 
2.查找
一对多映射,默认对many的一端使用懒加载的策略;
代码:
//测试一对多查询
     @Test
     public void testFind(){
           manager.find(Dept.class, 1);
     }
结果:
Hibernate:
    select
        dept0_.did as did1_0_0_,
        dept0_.dname as dname2_0_0_
    from
        tb_dept dept0_
    where
        dept0_.did=?
可以看出只查询了dept,也就是one的一方;many的一方只会在用到时查询;
如果向改变加载策略;可在@OneToMany注解后面的fetch属性修改为EAGER;
 
3.删除
删除one的一端时,会将one一端关联的many一端的外键通过update语句置空;然后再删除one的一端;
如果想在删除one一端的同时把关联的many一端同时删除;可以在@OneToMany注解后面加上属性cascade={CascadeType.REMOVE};
     @JoinColumn(name="id")
     @OneToMany(cascade={CascadeType.REMOVE})
     private Set<Emp> empSet;
 
代码:
     //测试删除
     @Test
     public void testRemove(){
           Dept dept=manager.find(Dept.class, 1);
           manager.remove(dept);
     }
结果:
Hibernate:
    select
        dept0_.did as did1_0_0_,
        dept0_.dname as dname2_0_0_
    from
        tb_dept dept0_
    where
        dept0_.did=?
Hibernate:
    update
        tb_emp
    set
        id=null
    where
        id=?
Hibernate:
    delete
    from
        tb_dept
    where
        did=?
 
4.修改
可以通过one的一方来修改many的一方;
例如代码:
     //测试修改
     @Test
     public void testUpdate(){
           Dept dept=manager.find(Dept.class,1);
           dept.getEmpSet().iterator().next().setSalary(99999);
     }
可改变关联的第一条数据的salary属性;
 
 
 
  

jpa单向一对多的更多相关文章

  1. JPA 单向一对多关联关系

    映射单向一对多的关联关系 1.首先在一的一端加入多的一端的实体类集合 2.使用@OneToMany 来映射一对多的关联关系3.使用@JoinColumn 来映射外键列的名称4.可以使用@OneToMa ...

  2. jpa单向一对多关联映射

    如果在一的@OneToMany有@manyToOne则是双向一对多关联,如果在多的那面没有@manyToOne关联则是单向一对多关联 class和student是一对多的关系 表结构 student ...

  3. JPA(六):映射关联关系------映射单向一对多的关联关系

    映射单向一对多的关联关系 新建项目项目请参考<JPA(二):HellWord工程>,基于上一章讲解的<JPA(五):映射关联关系------映射单向多对一的关联关系>中的例子进 ...

  4. JPA中实现单向一对多的关联关系

    场景 JPA入门简介与搭建HelloWorld(附代码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103473937 ...

  5. 7、单向一对多的关联关系(1的一方有n的一方的集合属性,n的一方却没有1的一方的引用)

    单向一对多的关联关系 具体体现:1的一方有n的一方的集合的引用,n的一方却没有1的一方的引用 举个例子:顾客Customer对订单Order是一个单向一对多的关联关系.Customer一方有对Orde ...

  6. JPA 一对一 一对多 多对一 多对多配置

    1 JPA概述 1.1 JPA是什么 JPA (Java Persistence API) Java持久化API.是一套Sun公司 Java官方制定的ORM 方案,是规范,是标准 ,sun公司自己并没 ...

  7. Hibernate5.2关联关系之单向一对多(一)

    Hibernate5.2之单向一对多 一. 简介    Hibernate中最复杂的应该就是各种关联(单向一对多.单向多对一.双向一对多.一对一.多对多)关系的映射,于是笔者就想着去写一些关于Hibe ...

  8. Hibernate单向“一对多”关联

    1. 基于连接表的单向“一对多”关联,应该优先被采用其中指定many-to-many的unique="true",为单向“一对多”,不指定就是单向“多对多” <class n ...

  9. (十一)Hibernate中的多表操作(1):单向一对多

    一.单向一对多() 案例一(用XML文件配置): 一个班级有多个学生,班级可以查看所有学生的信息. ClassBean.java package bean; import java.util.Hash ...

随机推荐

  1. Firebase Chat (firebase 实现web聊天室)

    基于firebase + cloud Function 实现web聊天(demo版) 知识点: 使用Firebase SDK创建Google Cloud功能. 触发云功能基于Auth,云存储和Clou ...

  2. lua与c的交互(运用)

    (1)lua程序 (2)C++程序(头文件) extern "C" {     #include "lua.h"     #include "lual ...

  3. C# WebApi日期格式化

    WebApi中日期格式化:在WebApiConfig文件中加入如下代码即可,之前遇到的问题,日期中总带有T,现在记录一下解决的方法. 代码: private static void ReturnDat ...

  4. js之语句(条件语句,循环语句,跳转语句)

    一.条件语句 1.if语句 条件语句是通过判断指定表达式的值来决定执行还是跳过某些语句,这些语句是代码是“决策点”有时称之为“分支”. if语句是一种基本的控制语句,它让Javascript程序可以选 ...

  5. 公众平台第三方平台 .NET开发

    前言:本博客借鉴了很多三方内容整理的,参考博客:竹叶苿. 一.开发的目的(以下是引用官方的话) 公众平台第三方平台 是为了让公众号或小程序运营者,在面向垂直行业需求时,可以一键授权给第三方平台(并且可 ...

  6. vue下载后台传过来的乱码流的解决办法

    后台返回的乱码流 解决办法: 请求方式用的是axios,主要加关键的 {responseType: 'blob'} axios封装 export function postDownload(url, ...

  7. 在线程中使用ClientQuery注意的问题

    今天遇到奇怪的问题,在线程中建立一个TkbmMWClientQuery的临时对象q,及一个TkbmMWBinaryStreamFormat的临时对象bsf,第一次执行正常,再次执行时一直等待,也不产生 ...

  8. qt tableview中如何添加右键菜单且不可编辑单元格

    QTableView是一个比较实用的类,下面教给大家如何在QTableView中添加右键菜单. #include <QMenu>#include <QAction> QTabl ...

  9. idea中无法自动提示相关jar包

    遇到的问题:今天在pom.xml导入数据库坐标后,发现在在配置数据相关属性时,idea无法使用我引入的jar包,后面才发现是因为在下载包时,没网络了,jar包下载失败 解决办法:cmd进入自己的mav ...

  10. C库函数——字符串转数字整理

    atof(将字符串转换成浮点型数)atoi(将字符串转换成整型数)atol(将字符串转换成长整型数)strtod(将字符串转换成浮点数)strtol(将字符串转换成长整型数)strtoul(将字符串转 ...