JPA 映射单向多对一的关联关系
映射 关系 关联 jpa 单向
2023-09-14 08:57:45 时间
1、首先在多的一端加入一的一端的实体类
//映射单向n-1的关联关
//使用@ManyToOne 来映射多对一的关系
//使用@JoinColumn 来映射外键/可以使用@ManyToOne的fetch属性来修改默认的关联属性的加载策略
package com.guigu.jpa.helloword; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.FetchType; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.ManyToOne; import javax.persistence.Table; /** * 单向多对一 * 一个订单可以有多个用户 * 一个用户可以有多个订单 * @author z * */ @Table(name="JPA_ORDERS") @Entity public class Order { private Integer id; private String orderName; private Customer customer; @GeneratedValue//使用默认的主键生成方式 @Id public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } @Column(name="ORDER_NAME") public String getOrderName() { return orderName; } public void setOrderName(String orderName) { this.orderName = orderName; } //映射单向n-1的关联关系 //使用@ManyToOne 来映射多对一的关系 //使用@JoinColumn 来映射外键 //可以使用@ManyToOne的fetch属性来修改默认的关联属性的加载策略 @JoinColumn(name="CUSTOMER_ID")//外键列的列名 @ManyToOne(fetch=FetchType.LAZY) public Customer getCustomer() { return customer; } public void setCustomer(Customer customer) { this.customer = customer; } @Override public String toString() { return "Order [id=" + id + ", orderName=" + orderName + ", customer=" + customer + "]"; } }
2、测试下代码
public class JPATest { private EntityManagerFactory entityManagerFactory; private EntityManager entityManager; private EntityTransaction transaction; @Before public void init(){ entityManagerFactory= Persistence.createEntityManagerFactory("jpa-1"); entityManager=entityManagerFactory.createEntityManager(); transaction=entityManager.getTransaction(); transaction.begin();//开启事务 } @After public void destroy(){ transaction.commit(); entityManager.close(); entityManagerFactory.close(); } /** * 更新操作 */ @Test public void testManyToOneUpdate(){ Order order=entityManager.find(Order.class, 2); order.getCustomer().setLastName("eeaa"); } /** * 单向多对一删除 * 注意不能直接删除一的一端因为有关系约束 */ @Test public void testManyToOneRemove(){ // Order order=entityManager.find(Order.class, 1); // entityManager.remove(order);//删除多的一端正常删除 Customer customer=entityManager.find(Customer.class, 5); //删除失败 entityManager.remove(customer); } //默认情况下,使用左外链接的方式获取n的一端的对象和其关联的1的一段的对象 //可以使用@ManyToOne的fetch属性来修改默认的关联属性的加载策略 @Test public void testManyToOneFind(){ Order order=entityManager.find(Order.class, 1); System.out.println(order.getOrderName()); System.out.println(order.getCustomer().getLastName()); } /** * 保存多对一,建议先保存1的一段,后保存n的一段,这样不会多出额外的UPDATE语句 */ //可以使用@ManyToOne的fetch属性来修改默认的关联属性的加载策略 @Test public void testManyToOnePersist(){ Customer customer=new Customer(); customer.setAge(16); customer.setBirth(new Date()); customer.setCreatedTime(new Date()); customer.setEmail("AA@163.com"); customer.setLastName("AA"); Order order1=new Order(); order1.setOrderName("o-AA-1"); Order order2=new Order(); order2.setOrderName("o-FF-2"); //设置关联关系 order1.setCustomer(customer); order2.setCustomer(customer); //执行保存操作 entityManager.persist(customer); entityManager.persist(order1); entityManager.persist(order2); } }
源码地址:https://github.com/wuhongpu/JPA.git
相关文章
- 数据对象映射模式
- Mybatis进阶学习笔记——输出映射
- 第九章 关系映射 集合关联映射
- 第九章 关系映射 多对多关联映射
- 实体关联关系映射:
- Java实现 LeetCode 706 设计哈希映射(数组+链表)
- hibernate之映射关系多对多
- SAP Spartacus B2B OrgUnit 和 OrgUser 的路由映射差异比较
- Atitit 保证产品易用性的方法总结 目录 1. 什么是易用性 易学 易见 三角关系1 2. 易用性原理 三原则 易见 映射 反馈2 2.1. 易见 Visibility 可读性2 2.2.
- Atitit.biz业务系统 面向框架 面向模式---------数据映射imp
- spring boot xml与dao 映射关系
- maven 编码GBK的不可映射字符 或者 UTF-8
- MATLAB | 全网唯一,三元相映射图绘制(三元相分级统计地图)
- 《一切皆是映射:代码的本质》哈希算法 (Hash)
- 一切皆是映射:浅谈操作系统内核的缺页异常(Page Fault)
- Hibernate之1-N关联映射
- Go语言入门——数组、切片和映射(下)
- 深入浅出Hibernate(二)多对一关系映射
- gpnmb+ gpnmb-AT2 cell空转映射 上皮细胞的空转映射
- RBF网络——核心思想:把向量从低维m映射到高维P,低维线性不可分的情况到高维就线性可分了
- 集合映射Set(使用xml文件)
- Spring MVC简单URL处理程序映射
- 【Bringing Old Photos Back to Life】Mapping(mapping_net)映射网络