JPA一对多关联

简介:   关于JPA一对多关联这里使用Order与OrderItem来模拟。一个Order可以关联多个OrderItem,而一个OrderItem只能关联一个Order。Order与OrderItem是一对多的关联关系。

  关于JPA一对多关联这里使用Order与OrderItem来模拟。一个Order可以关联多个OrderItem,而一个OrderItem只能关联一个Order。Order与OrderItem是一对多的关联关系。Order类如下:

 1 package com.yichun.bean;
 2 
 3 import java.util.HashSet;
 4 import java.util.Set;
 5 
 6 import javax.persistence.CascadeType;
 7 import javax.persistence.Column;
 8 import javax.persistence.Entity;
 9 import javax.persistence.Id;
10 import javax.persistence.OneToMany;
11 import javax.persistence.Table;
12 
13 @Entity
14 @Table(name = "orders")
15 public class Order {
16 
17     private String orderId;
18     private Float amoutn = 0f;
19     private Set<OrderItem> items = new HashSet<OrderItem>();
20 
21     @Id
22     @Column(length = 12, nullable = false)
23     public String getOrderId() {
24         return orderId;
25     }
26 
27     public void setOrderId(String orderId) {
28         this.orderId = orderId;
29     }
30 
31     @Column(nullable = false)
32     public Float getAmoutn() {
33         return amoutn;
34     }
35 
36     public void setAmoutn(Float amoutn) {
37         this.amoutn = amoutn;
38     }
39 
40     // CascadeType.REFRESH,级联刷新。orderItems更改的时候,就重新加载orderItems
41 
42     // CascadeType.PERSIST, 级联保存。insert order insert into orderitem 。调用manager.persist(new Order())的时候才会起作用
43 
44     // CascadeType.MERGE,级联更新 。order在游离状态的时候被修改了,order中的orderItem也被修改了,update order for (update orderItem)。 调用manager.merge(order) 的时候才会起作用
45 
46     // CascadeType.REMOVE级联删除。 删除order的时候,orderItems也会被删除,没有住外键约束的时候。调用manager.remove(order)的时候才会起作用。
47     
48     // 针对实体管理器的四种方法
49     // fetch =FetchType.LAZY默认是延迟加载。××tomany由一方得到多的一方的时候,默认就是延迟加载,××toone的时候,默认就是立即加载
50     // 出现mappedBy的类就是关系被维护端。关系由对方里面的order属性维护
51     @OneToMany(cascade = { CascadeType.REFRESH, CascadeType.PERSIST,
52             CascadeType.MERGE, CascadeType.REMOVE }, mappedBy = "order")
53     public Set<OrderItem> getItems() {
54         return items;
55     }
56 
57     public void setItems(Set<OrderItem> items) {
58         this.items = items;
59     }
60 
61     // 建立两者之间的关系
62     public void addOrderItem(OrderItem orderItem) {
63         orderItem.setOrder(this);
64         this.items.add(orderItem);
65     }
66 }

OrderItem类如下:

 1 package com.yichun.bean;
 2 
 3 import javax.persistence.CascadeType;
 4 import javax.persistence.Column;
 5 import javax.persistence.Entity;
 6 import javax.persistence.GeneratedValue;
 7 import javax.persistence.Id;
 8 import javax.persistence.JoinColumn;
 9 import javax.persistence.ManyToOne;
10 
11 @Entity
12 public class OrderItem {
13     private Integer id;
14     private String productName;
15     private Float sellPrice = 0f;
16     private Order order;
17 
18     @Id
19     @GeneratedValue
20     public Integer getId() {
21         return id;
22     }
23 
24     public void setId(Integer id) {
25         this.id = id;
26     }
27 
28     @Column(length = 40, nullable = false)
29     public String getProductName() {
30         return productName;
31     }
32 
33     public void setProductName(String productName) {
34         this.productName = productName;
35     }
36 
37     @Column(nullable = false)
38     public Float getSellPrice() {
39         return sellPrice;
40     }
41 
42     public void setSellPrice(Float sellPrice) {
43         this.sellPrice = sellPrice;
44     }
45 
46     // optional=true,在数据库中允许为null
47     @ManyToOne(cascade = { CascadeType.MERGE, CascadeType.REFRESH }, optional = true)// 级联更新,级联刷新
48     @JoinColumn(name = "order_id")
49     public Order getOrder() {
50         return order;
51     }
52 
53     public void setOrder(Order order) {
54         this.order = order;
55     }
56 }

保存数据:

 1     @Test
 2     public void save() {
 3         EntityManagerFactory factory = Persistence
 4                 .createEntityManagerFactory("testjpa");
 5         EntityManager manager = factory.createEntityManager();
 6         manager.getTransaction().begin();
 7 
 8         Order order = new Order();
 9         order.setAmoutn(120f);
10         order.setOrderId("999");// UUID.randomUUID().toString()
11 
12         OrderItem item = new OrderItem();
13         item.setProductName("足球");
14         item.setSellPrice(90f);
15 
16         OrderItem item2 = new OrderItem();
17         item2.setProductName("排球");
18         item2.setSellPrice(30f);
19 
20         // 设置两者之间的关联
21         order.addOrderItem(item);
22         order.addOrderItem(item2);
23 
24         // 保存Order,此时也会保持OrderItem
25         manager.persist(order);
26 
27         manager.getTransaction().commit();
28         manager.clear();
29         factory.close();
30     }

 

目录
相关文章
|
Kubernetes Perl 容器
【kubernetes】修改集群节点中 Pod 数量限制
Kubernetes 默认每个节点只能启动 110 个 Pod,由于业务需要,将每个节点默认限制的 Pod 数量改为 200。
3519 0
|
XML Oracle 关系型数据库
GeoTools之入门简介
GeoTools是一套开源的用java言语开发的GIS开发工具包,可以基于GeoTools开发符合标准的地理信息系统。GeoTools 提供了 OGC(Open Geospatial Consortium)规范的一个实现来作为他们的开发。
2193 0
GeoTools之入门简介
|
弹性计算 Windows
同步服务器时间NTP
在秒杀、抢券等高并发的活动中,一点点的时间延迟,也会让自己后悔莫及……
2119 0
同步服务器时间NTP
|
4月前
|
Ubuntu Linux 网络安全
轻松掌握Ubuntu图形化界面安装与使用指南
在腾讯云控制台中,首先定位到你的服务器实例,点击右侧的“更多”按钮,在下拉菜单中选择“管理”选项。接着,在管理界面中找到并点击“VNC远程登陆”按钮,进入远程登录选项界面。在该界面中,寻找并选择“VNC登录”选项,即可开始使用VNC进行远程连接。
|
分布式计算 Java Hadoop
crontab环境变量问题
在crontab中运行脚本来查看hadoop相关信息,由于hadoop、java默认部署在/usr/local下面, 所以导致crontab执行时出现报错。具体与环境变量有关系,下文描述比较清楚。
1657 0
|
机器学习/深度学习 算法 数据挖掘
深度学习面试问题目录 | 深度学习目标检测、语义分割、分类上百种面试问答技巧
这篇文章汇总了深度学习面试,特别是目标检测领域的常见问题,提供了一个详细的目录大纲,便于读者直接跳转至答案。通过理解和解答这些问题,求职者能展示其在深度学习专业的知识、解决问题的能力及对应用的理解,从而提高面试成功率和竞争力。包含多个专题,如损失函数、Python解释器、经典网络、YOLO系列、激活函数等。
|
12月前
|
机器学习/深度学习 人工智能 监控
API超越应用的时代,深入了解F5 API安全解决方案
API超越应用的时代,深入了解F5 API安全解决方案
142 3
|
边缘计算 5G vr&ar
|
数据采集 搜索推荐 安全
做谷歌独立站多少钱?
答案是:做谷歌独立站是3000元。 当你想在谷歌上创建一个独立站点,你可能会想知道这需要多少费用。 以下内容将为你详细解释与创建谷歌独立站点相关的费用。 初始建站费用 首先,你需要购买一个域名。 通常,一个域名的价格会在10元至200元之间,这取决于域名的流行度和后缀。 接下来,你可能需要一个主机来托管你的网站,这通常每月会花费你20元至200元。
883 0
做谷歌独立站多少钱?
|
数据安全/隐私保护
注销备案须知及操作步骤
若您的网站已经在阿里云成功备案,现要停止该网站的服务,需注销主体或网站在工信部的备案信息。
3516 0