单向一对多是一个类中的一条记录可对应另一个类的多条记录;
比如一个部门可对应多个员工;
 
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. ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

    MFC中ASSERT作为断言语句,括号内内容为TRUE,继续执行:为FALSE终止执行.之后取得当前窗口的系统菜单,在这个菜单中添加字符串资源IDS_ABOUTBOX和菜单资源IDM_ABOUTBOX ...

  2. 二项式反演/minmax容斥初探

    世界是物质的,物质是运动的,运动是有规律的,规律是可以被认识的 二项式反演 \[ g_n=\sum_{i=0}^n \binom{n}if_i\Rightarrow f_n=\sum_{i=0}^n( ...

  3. windows 控制台默认为UTF-8显示的方法

    这里需要先了解些内容: CHCP CHCP是MS DOS中的命令,用来显示或设置活动代码页编号的.用法是: CHCP [nnn] 其中nnn指定的是代码页的编号.这个参数是可选的,在命令行下如果不指定 ...

  4. oracle建表详细信息

    一张用户表 -- Create table create table OA_DM.DM_GY_USER ( ), username ) not null, loginname ) not null, ...

  5. nnginx配置代理服务器

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

  6. Eclipse 快捷键、文档注释、多行注释的快捷键

    关于快捷键 Eclipse 的很多操作都提供了快捷键功能,我们可以通过键盘就能很好的控制 Eclipse 各个功能: 一.多行注释快捷键 1.选中你要加注释的区域,用ctrl+shift+C 或者ct ...

  7. 百度URL链接中文转码

    百度搜索链接规则为: http://www.baidu.com/s?wd=[搜索词目]&cl=3 有多个搜索词通过加号进行链接: http://www.baidu.com/s?wd=keywo ...

  8. [Android] Installation failed due to: ''pm install-create -r -t -S 4590498' returns error 'UNSUPPORTED''

    小米特有问题 关闭开发者选项的启用MIUI优化 不得不说, 这是真的坑...

  9. haproxy + keepalived + mycat 高可用与负载均衡集群配置 centos7

    架构如上,但是其实keepalived.haproxy.Mycat都可以多台(比如keepalived.haproxy.Mycat各3台,3台keepalived抢占vip,然后抢到vip的hapro ...

  10. 从无建立一个vue项目

    node.js安装 首先安装Node,官网地址 :https://nodejs.org/en/download/ ,进去下载关于符合自己电脑的下载. 具体的Node安装步骤参考地址: https:// ...