单向一对多是一个类中的一条记录可对应另一个类的多条记录;
比如一个部门可对应多个员工;
 
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. Typora的使用-规整笔记 让我以后的笔记内容更加整齐

    以后我用typora写笔记使用这种排版方式, 且可以方便的看到大纲. 大标题二级标题 内容分类 三级标题 内容讲解 四级标题 内容分块 五级标题

  2. 区间dp之 "石子合并"系列(未完结)

    A. 石子合并<1> 内存限制:128 MiB 时间限制:1000 ms 标准输入输出 题目类型:传统评测 方式:文本比较   题目描述 有N堆石子排成一排(n<=100),现要将石 ...

  3. 利用requests提交相同名称数据的处理方法

    #字典键不能重复 data={ boardid' : boardid, 'divids[ ]' : '0' , 'divids[ ]' : '1' , 'divids[ ]' : '2' , } #这 ...

  4. 解决Spring Boot集成Shiro,配置类使用Autowired无法注入Bean问题

    如题,最近使用spring boot集成shiro,在shiroFilter要使用数据库动态给URL赋权限的时候,发现 @Autowired 注入的bean都是null,无法注入mapper.搜了半天 ...

  5. X86逆向14:常见的脱壳手法

    本章节内容将介绍软件的脱壳技术.什么是加壳?加壳就是用来压缩或者保护软件不被非法修改破解的一种工具,而脱壳就是将已经加壳的程序从壳中剥离出来,既然能给程序进行加壳,那也就会有相应的脱壳方法,本节课我们 ...

  6. go 常量

    // 参考:https://studygolang.com/articles/15905?fr=sidebar // iota迭代定义常量 //const配合iota关键字使用,可以定义一组由0开始+ ...

  7. TreeMap——实现comparable接口并重写CompareTo方法

    public class TreeMapTest { public static void main(String[] args) { Map<Student,Integer> stude ...

  8. HTML的学习2(代码)

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. vue-app物理返回键跳到指定页面

    例如提交订单成功跳到了订单详情页面,再返回就又到了提交订单支付页面 我们需要返回到其他页面 1.挂载完成后,判断浏览器是否支持popstate mounted(){ if (window.histor ...

  10. vue的数据代理

    1. vue数据代理: data对象的所有属性的操作(读/写)由vm对象来代理操作2. 好处: 通过vm对象就可以方便的操作data中的数据3. 实现: 1). 通过Object.defineProp ...