一个用户对应多个订单,多个订单对应一个用户,不管查哪一边都可以得到另一边的信息

用户类:Customer

import lombok.Data;

import javax.persistence.*;
import java.util.HashSet;
import java.util.Set; @Data
@Entity(name = "TwoWay_CUTOMERS")
@Table(name = "TwoWay_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 的一段也删除,级联删除
// 若在 1 的一端的 @OneToMany 中使用 mappedBy 属性, 则 @OneToMany 端就不能再使用 @JoinColumn 属性
//@JoinColumn(name = "CUSTOMER_ID")
@OneToMany(mappedBy = "customer", fetch = FetchType.EAGER, cascade = {CascadeType.REMOVE})
private Set<Order> orders = new HashSet<>();
}

订单类:Order

import lombok.Getter;
import lombok.Setter;
import lombok.ToString; import javax.persistence.*; @Getter
@Setter
@ToString
@Entity(name = "TwoWay_ORDERS")
@Table(name = "TwoWay_ORDERS")
public class Order { @Id
@GeneratedValue
private Integer id; @Column(name = "ORDER_NAME")
private String orderName; @JoinColumn(name = "CUSTOMER_ID")
@ManyToOne()
private Customer customer;
}

测试

添加

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();
} // 若是双向 1-n 的关联关系, 执行保存时
// 若先保存 n 的一端, 再保存 1 的一端, 默认情况下, 会多出 2n 条 UPDATE 语句
// 若先保存 1 的一端, 则会多出 n 条 UPDATE 语句
// 在进行双向 1-n 关联关系时, 建议使用 n 的一方来维护关联关系, 而 1 的一方不维护关联系, 这样会有效的减少 SQL 语句
// 注意: 若在 1 的一端的 @OneToMany 中使用 mappedBy 属性, 则 @OneToMany 端就不能再使用 @JoinColumn 属性了
@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); order1.setCustomer(customer);
order2.setCustomer(customer); entityManager.persist(order1);
entityManager.persist(order2);
//执行保存操作
entityManager.persist(customer);
}
}

由 n 方来维护关联关系,1 的一方不维护

// 若在 1 的一端的 @OneToMany 中使用 mappedBy 属性, 则 @OneToMany 端就不能再使用 @JoinColumn 属性
// @JoinColumn(name="CUSTOMER_ID")
@OneToMany(mappedBy="customer")
public Set<Order> getOrders() {
return orders;
}

再调整下保存顺序

@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); order1.setCustomer(customer);
order2.setCustomer(customer); //执行保存操作
entityManager.persist(customer); entityManager.persist(order1);
entityManager.persist(order2);
}

7、JPA-映射-双向一对多的更多相关文章

  1. JPA学习笔记(8)——映射双向一对多关联关系

    双向一对多关联关系 前面的博客讲的都是单向的,而本问讲的是双向的(双向一对多 = 双向多对一) 什么是双向? 我们来对照一下单向和双向 单向/双向 User实体类中是否有List< Order& ...

  2. 测试开发专题:spring-boot如何使用JPA进行双向一对多配置

    本片文章我们主要介绍spring-boot如何进行JPA的配置以及如何进行实体间的一对多配置. 依赖准备 要在spring-boot使用jpa需要在项目中有进入相关的依赖,pom文件里加入下面内容 & ...

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

    映射双向多对一的关联关系 修改Customer.java package com.dx.jpa.singlemanytoone; import java.util.Date; import java. ...

  4. JPA总结——实体关系映射(一对多@OneToMany)

    JPA总结——实体关系映射(一对多@OneToMany) 注意:本文出自“阿飞”的博客,如果要转载本文章,请与作者联系! 并注明来源: http://blog.sina.com.cn/s/blog_4 ...

  5. Mybatis框架中实现双向一对多关系映射

    学习过Hibernate框架的伙伴们很容易就能简单的配置各种映射关系(Hibernate框架的映射关系在我的blogs中也有详细的讲解),但是在Mybatis框架中我们又如何去实现 一对多的关系映射呢 ...

  6. JPA学习---第九节:JPA中的一对多双向关联与级联操作

    一.一对多双向关联与级联操作 1.创建项目,配置文件代码如下: <?xml version="1.0" encoding="UTF-8"?> < ...

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

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

  8. Hibernate 双向一对多的关联映射

    双向的一对多的关联关系是单项的一对多和单项的多对一的情况下产生的. 1.设计表结构 虽然关联关系变为双向的一对多,但是我们表结构不会发生改变,只是指向变了. 2.创建student对象 3.创建Gra ...

  9. 10、JPA_映射双向多对多的关联关系

    双向多对多的关联关系 双向多对多的关联关系(抽象成A-B)具体体现:A中有B的集合的引用,同时B中也有对A的集合的引用.A.B两个实体对应的数据表靠一张中间表来建立连接关系. 同时我们还知道,双向多对 ...

  10. 9、JPA_映射双向一对一的关联关系

    双向一对一的关联关系 举例说明:经理Manager和部门Department是双向一对一关联关系.则Manager实体类中有Department实体对象的引用,反之亦然. 其实体属性定义如下: Lis ...

随机推荐

  1. linux不能上网问题

    第一种方法: 当linux不能上网,将网络配置成dhcp(注意:这里只能小写) onboot设置能yes 第二种方法: 第三种 window+r 快捷键 HKEY_LOCAL_MACHINE--> ...

  2. [Codeforces1132G]Greedy Subsequences——线段树+单调栈

    题目链接: Codeforces1132G 题目大意:给定一个序列$a$,定义它的最长贪心严格上升子序列为$b$满足若$a_{i}$在$b$中则$a_{i}$之后第一个比它大的也在$b$中.给出一个数 ...

  3. BZOJ5475 WC2019数树(prufer+容斥原理+树形dp+多项式exp)

    因为一大堆式子实在懒得写题解了.首先用prufer推出CF917D用到的结论,然后具体见前言不搭后语的注释. #include<iostream> #include<cstdio&g ...

  4. 后台CRUD管理jqGrid 插件下载、使用、demo演示

    jqGrid:demo?version=5.2.1download src: http://www.trirand.com/blog/ github:https://github.com/tonyto ...

  5. bzoj2288 生日礼物 (线段树)

    我当然想选最大的子段和啦 但要选M次 那不一定就是最好的 所以提供一个反悔的选项,我选了一段以后,就把它们乘个-1,然后再选最好的(类似于网络流的思路) 这个可以用线段树来维护,记一个区间包含左端点/ ...

  6. 【Linux】linux正则表达式及通配符

    正则表达式就是用于匹配每行输入的一种模式,模式是指一串字符序列.拥有强大的字符搜索功能.也非常方便的搜索过滤出我们想要的内容. linux正则表达式分为基本正则表达式(Basic Regexp)和扩展 ...

  7. 以太坊、Hyperledger Fabric和Corda,哪个更好?

    原创: Philipp Sandner 区块链前哨 昨天 编译|盖磊编辑|前哨小兵甲区块链前哨导语: 我们分析了 Hyperledger Fabric,R3 Corda 和以太坊这三种分布式账本技术间 ...

  8. poj2689 Prime Distance

    题意:求[a, b]之间差最大/小的相邻素数. 0 < a, b < 2^32, 0 < b - a <= 1e6 首先发现a,b很大,以至于无法求出素数来. 然后就考虑退而求 ...

  9. 既然写CSS很容易,那为什么大家还是把CSS写的那么烂呢?

    在众成翻译上看到一篇不错的css文章,所以就给转过来. 在你开始阅读这篇文章之前,一定要做好心理准备.因为我写的 90% 都是在发牢骚,只有最后大概 10% 介绍 CSS 技巧之最佳实践.提前给你们打 ...

  10. 收集JavaScript中常用的方法函数

    本文中,收集了一些比较常用的Javascript函数,希望对学习JS的朋友们有所帮助. 1. 字符串长度截取 function cutstr(str, len) { var temp, icount ...