6、JPA-映射-单向一对多
一个用户对应多个订单
用户类:Customer
import lombok.Data; import javax.persistence.*;
import java.util.HashSet;
import java.util.Set; @Data
@Entity(name = "OneToMany_CUTOMERS")
@Table(name = "OneToMany_CUTOMERS")
public class Customer { @Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id; @Column(name = "LAST_NAME", length = 50, nullable = false)
private String lastName; private String email; // 映射单向 1-n 的关联关系
// 使用 @OneToMany 来映射 1-n 的关联关系
// 使用 @JoinColumn 来映射外键列的名称
// 可使用 @ManyToOne 的 fetch 属性来修改默认的关联属性的加载策略,在左外连接和两条SQL间切换
// 使用 @OneToMany 的 cascade 属性来修改默认的删除策略,例在删除 1 的一端时,把 n 的一段也删除,级联删除
@JoinColumn(name = "CUSTOMER_ID")
@OneToMany(fetch = FetchType.EAGER, cascade = {CascadeType.REMOVE})
private Set<Order> orders = new HashSet<>();
}
订单类:Order
import lombok.Data; import javax.persistence.*; @Data
@Entity(name = "OneToMany_ORDERS")
@Table(name = "OneToMany_ORDERS")
public class Order { @Id
@GeneratedValue
private Integer id; @Column(name = "ORDER_NAME")
private String orderName;
}
测试
建表
import org.junit.After;
import org.junit.Before;
import org.junit.Test; import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence; public class JPAyingshe {
private EntityManagerFactory entityManagerFactory;
private EntityManager entityManager;
private EntityTransaction transaction; @Before
public void init() {
entityManagerFactory = Persistence.createEntityManagerFactory("jpaname");
entityManager = entityManagerFactory.createEntityManager();
transaction = entityManager.getTransaction();
transaction.begin();
} @After
public void destroy() {
transaction.commit();
entityManager.close();
entityManagerFactory.close();
} @Test
public void createTable() {}
}

添加
// 单向 1-n 关联关系执行保存时, 一定会多出 UPDATE 语句,与保存先后顺序无关
// 因为 n 的一端在插入时不会同时插入外键列
@Test
public void testOneToManyPersist() {
Customer customer = new Customer();
customer.setEmail("mm@163.com");
customer.setLastName("MM"); Order order1 = new Order();
order1.setOrderName("O-MM-1"); Order order2 = new Order();
order2.setOrderName("O-MM-2"); //建立关联关系
customer.getOrders().add(order1);
customer.getOrders().add(order2); //执行保存操作
entityManager.persist(customer); entityManager.persist(order1);
entityManager.persist(order2);
}

查询
// 默认对关联的多的一方使用懒加载策略
// 可以使用 @OneToMany 的 fetch 属性来修改默认的加载策略
@Test
public void testOneToManyFind() {
Customer customer = entityManager.find(Customer.class, 14);
System.out.println(customer.getLastName()); System.out.println(customer.getOrders().size());
}

关闭懒加载
// 使用 @OneToMany 的 fetch 属性来修改默认的加载策略
@JoinColumn(name="CUSTOMER_ID")
@OneToMany(fetch=FetchType.EAGER)
public Set<Order> getOrders() {
return orders;
}

删除
// 默认情况下, 若删除 1 的一端, 则会先把关联的 n 的一端的外键置空, 然后进行删除
// 可以通过 @OneToMany 的 cascade 属性来修改默认的删除策略
@Test
public void testOneToManyRemove() {
Customer customer = entityManager.find(Customer.class, 14);
entityManager.remove(customer);
}

修改删除策略,例在删除 1 的一端时,把 n 的一段也删除,级联删除
// 使用 @OneToMany 的 cascade 属性来修改默认的删除策略
@JoinColumn(name="CUSTOMER_ID")
@OneToMany(cascade={CascadeType.REMOVE})
public Set<Order> getOrders() {
return orders;
}
修改
@Test
public void testUpdate(){
Customer customer = entityManager.find(Customer.class, 20); customer.getOrders().iterator().next().setOrderName("YD-20");
}

6、JPA-映射-单向一对多的更多相关文章
- JPA(六):映射关联关系------映射单向一对多的关联关系
映射单向一对多的关联关系 新建项目项目请参考<JPA(二):HellWord工程>,基于上一章讲解的<JPA(五):映射关联关系------映射单向多对一的关联关系>中的例子进 ...
- JPA 映射单向多对一的关联关系
1.首先在多的一端加入一的一端的实体类 //映射单向n-1的关联关 //使用@ManyToOne 来映射多对一的关系 //使用@JoinColumn 来映射外键/可以使用@ManyToOne的fetc ...
- JPA 单向一对多关联关系
映射单向一对多的关联关系 1.首先在一的一端加入多的一端的实体类集合 2.使用@OneToMany 来映射一对多的关联关系3.使用@JoinColumn 来映射外键列的名称4.可以使用@OneToMa ...
- 7、单向一对多的关联关系(1的一方有n的一方的集合属性,n的一方却没有1的一方的引用)
单向一对多的关联关系 具体体现:1的一方有n的一方的集合的引用,n的一方却没有1的一方的引用 举个例子:顾客Customer对订单Order是一个单向一对多的关联关系.Customer一方有对Orde ...
- jpa单向一对多关联映射
如果在一的@OneToMany有@manyToOne则是双向一对多关联,如果在多的那面没有@manyToOne关联则是单向一对多关联 class和student是一对多的关系 表结构 student ...
- JPA总结——实体关系映射(一对多@OneToMany)
JPA总结——实体关系映射(一对多@OneToMany) 注意:本文出自“阿飞”的博客,如果要转载本文章,请与作者联系! 并注明来源: http://blog.sina.com.cn/s/blog_4 ...
- JPA中实现单向一对多的关联关系
场景 JPA入门简介与搭建HelloWorld(附代码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103473937 ...
- jpa单向一对多
单向一对多是一个类中的一条记录可对应另一个类的多条记录: 比如一个部门可对应多个员工: jpa中的实现步骤: one-to-many的one类中添加一个many类类型的set;比如部门类D ...
- JPA学习笔记(8)——映射双向一对多关联关系
双向一对多关联关系 前面的博客讲的都是单向的,而本问讲的是双向的(双向一对多 = 双向多对一) 什么是双向? 我们来对照一下单向和双向 单向/双向 User实体类中是否有List< Order& ...
- JPA(五):映射关联关系------映射单向多对一的关联关系
映射单向多对一的关联关系 新建Customer.java: package com.dx.jpa.singlemanytoone; import java.util.Date; import java ...
随机推荐
- kibana get 查询失效
kibana版本:5.4 在使用kibana 查询数据时,如果我们根据数据id 来获得一条数据,写法 get 索引名称/类型名称/文档主键 如:get testindex/testtype/01 这样 ...
- WIN8.1下Prolific USB-to-Serial Comm Port驱动黄色感叹号问题
文章解决来源:http://blog.csdn.net/gsj0791/article/details/17664861 在做fpga口的uart回环测试时候,由于开发板上的是usb转uart,所以需 ...
- Poj 1659.Frogs' Neighborhood 题解
Description 未名湖附近共有N个大小湖泊L1, L2, ..., Ln(其中包括未名湖),每个湖泊Li里住着一只青蛙Fi(1 ≤ i ≤ N).如果湖泊Li和Lj之间有水路相连,则青蛙Fi和 ...
- 【转】RO段、RW段和ZI段 --Image$$??$$Limit 含义(zz)
@2019-02-14 [小记] RO段.RW段和ZI段 --Image$$??$$Limit 含义(zz)
- 源码分析-AutoCloseable
AutoCloseable 该接口用于try-with-resources语法糖提供支持,用于自动关闭资源作用 类型:接口 方法:close(); 详解: close():用于自动关闭资源的时候需要进 ...
- dom4j解析xml时取消DTD验证
解决方式整合一下,就分两种: 1.用setFeature() SAXReader reader = new SAXReader();reader.setValidation(false); reade ...
- QML学习笔记(七)— 实现可拖拽、编辑、选中的ListView
鼠标单击可选中当前项,头部呈绿色显示:按压当前项可进行拖拽更换列表项位置:点击数据可以进行编辑: GitHub:八至 作者:狐狸家的鱼 这里是自己定义的model,有些字体和颜色都是使用的全局属性, ...
- echarts x轴文字显示不全解决办法
标题:echarts x轴文字显示不全(xAxis文字倾斜比较全面的3种做法值得推荐):http://blog.csdn.net/kebi007/article/details/68488694
- poj2259 Team Queue
吼哇,又是水题. 我本来准备开1010个queue的,但是STL容器里好像只有vector滋磁开组,于是只好数组模拟... 然后模拟过了...... #include <cstdio> # ...
- 在hive中UDF和UDAF使用说明
Hive进行UDF开发十分简单,此处所说UDF为Temporary的function,所以需要hive版本在0.4.0以上才可以. 一.背景:Hive是基于Hadoop中的MapReduce,提供HQ ...
