一个用户对应多个订单

用户类: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-映射-单向一对多的更多相关文章

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

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

  2. JPA 映射单向多对一的关联关系

    1.首先在多的一端加入一的一端的实体类 //映射单向n-1的关联关 //使用@ManyToOne 来映射多对一的关系 //使用@JoinColumn 来映射外键/可以使用@ManyToOne的fetc ...

  3. JPA 单向一对多关联关系

    映射单向一对多的关联关系 1.首先在一的一端加入多的一端的实体类集合 2.使用@OneToMany 来映射一对多的关联关系3.使用@JoinColumn 来映射外键列的名称4.可以使用@OneToMa ...

  4. 7、单向一对多的关联关系(1的一方有n的一方的集合属性,n的一方却没有1的一方的引用)

    单向一对多的关联关系 具体体现:1的一方有n的一方的集合的引用,n的一方却没有1的一方的引用 举个例子:顾客Customer对订单Order是一个单向一对多的关联关系.Customer一方有对Orde ...

  5. jpa单向一对多关联映射

    如果在一的@OneToMany有@manyToOne则是双向一对多关联,如果在多的那面没有@manyToOne关联则是单向一对多关联 class和student是一对多的关系 表结构 student ...

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

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

  7. JPA中实现单向一对多的关联关系

    场景 JPA入门简介与搭建HelloWorld(附代码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103473937 ...

  8. jpa单向一对多

    单向一对多是一个类中的一条记录可对应另一个类的多条记录: 比如一个部门可对应多个员工:   jpa中的实现步骤:     one-to-many的one类中添加一个many类类型的set;比如部门类D ...

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

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

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

    映射单向多对一的关联关系 新建Customer.java: package com.dx.jpa.singlemanytoone; import java.util.Date; import java ...

随机推荐

  1. ajax提交 返回中文乱码问题

    接口返回数据相关 使用@ResponseBody后返回NUll 说明:刚把后台运行起来,兴高采烈的测试接口数据,结果无论如何都是返回null, 最终通过各种百度,发现原来是没有引入关键的Jar包. 解 ...

  2. Win10下创建Python3.7创建虚拟环境以及安装Flask框架

    鉴于现在看到的很多虚拟环境创建以及flask框架安装方式需要通过dos命令来做,虽然比较常用,但是每次运行都要激活虚拟环境,相对比较麻烦,而现在利用pycharm大可不必如此. 1.安装破解版pych ...

  3. MySQL中 如何查询表名中包含某字段的表

    查询tablename 数据库中 以"_copy" 结尾的表 select table_name from information_schema.tables where tabl ...

  4. python3 hashlib模块

    hashlib是一个加密模块,可以将明文加密为密文: md5,sha加密:过程不可逆转.

  5. linux中监控CPU、内存和磁盘状态的shell脚本。(centos7)

    这篇博客中所写的脚本,在实际工作中并没有什么卵用,工作中并不会用到这种脚本去监控.不过自己写一遍,可以让初学者对CPU.内存.磁盘等一些基础知识和基础命令更加了解. 1.利用vmstat工具监控CPU ...

  6. android 读取EXcel 文件 读取文件内存卡的权限

    android 采用Java的读取xls文件的方式实现. 需要导入第三方Jxl.jar 包.  代码改自 其他博主  : 这只摘录下 读取xls文件的部分代码,当然这个代码在安卓平台需要添加下面的权限 ...

  7. 【Vijos】lxhgww的奇思妙想(长链剖分)

    题面 给定一棵树,每次询问一个点的\(k\)次祖先,强制在线. Vijos 题解 长链剖分. 链接暂时咕咕咕了. 现在可以戳链接看题解了 #include<iostream> #inclu ...

  8. vue路由原理剖析

    单页面应用(SPA)的核心之一是: 更新视图而不重新请求页面, 实现这一点主要是两种方式: 1.Hash: 通过改变hash值 2.History: 利用history对象新特性(详情可出门左拐见:  ...

  9. C/C++ 控制台窗口暂停

    为什么我看不到控制台的输出结果? 在编写C++程序中,经常会出现,控制台窗口一闪就消失了的情况 为什么会这样? 原因简单到有点可笑:因为程序运行结束了 对于控制台程序,操作系统让它开始运行前会为它造一 ...

  10. Mybatis中org.apache.ibatis.binding.BindingException错误问题总结

    1. Mybatis出现多个参数,但是多个参数中没有使用@Param注解进行修饰 2. Xml文件中字段名和PO绑定时候,字段写错了 3.XML中<foreach/>标签中的colleac ...