单向一对多是一个类中的一条记录可对应另一个类的多条记录;
比如一个部门可对应多个员工;
 
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. Bean属性复制,字段名可不同,字段类型不同需要自行处理

    @Setter @Getter public class SourceA { private String name; private String text; public SourceA(Stri ...

  2. maraidb忘记数据密码

    一.概述 服务器上安装了maraidb 数据库,但是很久未使用过它,需要使用时,忘记了密码, 此时可以给它重新设置密码. 二.操作 修改密码 修改 /etc/my.cnf,修改下图红色区域位置,修改成 ...

  3. nnginx配置代理服务器

    因为有些服务有ip白名单的限制,部署多节点后ip很容易就不够用了,所以可以将这些服务部署到其中的一些机器上, 并且部署代理服务器,然后其余机器以代理的方式访问服务.开始是以tinyproxy作为代理服 ...

  4. c# winform 窗体间的传值

    1.父窗体传值给子窗体: 1) 父窗体: FrmXX frm = ,); frm.Owner = this; frm.ShowDialog(); 子窗体: ; public FrmXX(int ty, ...

  5. var正在声明变量

    var正在声明变量也可以直接分配一个变量,而不在JS中声明它,但是这种变量在默认情况下是全局的.<!-/->是HTML中的注释,在JS中不起作用.它只是用来忽略无法识别脚本的浏览器的脚本内 ...

  6. AL11新建目录、删除目录

    AL11可以进入SAP应用服务器中. 项目上需要和外围系统做接口 写文件到文件服务器上,让外围系统过来读取,但是为了减少SAP应用服务器的负担,需要一台独立的文件服务器共享目录到SAP应用服务器, 也 ...

  7. 解决Eclipse中springBoot中文乱码问题

    除了常见的application.properties文件中设置#设置spring-boot 编码格式banner.charset=UTF-8server.tomcat.uri-encoding=UT ...

  8. Django单元测试 相关知识

    前言 本文,旨在说明python Django如何编写单元测试,从“背景”,“测试要求”,“代码编写”,“如何运行”,“检验测试覆盖度” 这几个方面来说明附上django的官方文档单元测试章节=> ...

  9. Springboot 测试类没有找到bean注入

    其他乱七八糟配置就不扯了,先上项目结构图 配置好参数后我再src/test/java类测试访问数据库时发现bean没有正确的注入.值得注意的是,这个项目的启动类是叫App.java 所以我们必须在这个 ...

  10. 使用ViewFlipper实现图片轮播

    public class MainActivity extends AppCompatActivity { private ViewFlipper flipper; //背景图片int[] id pr ...