java - 在 Spring Data JPA 中嵌入对象而不是链接
问题描述
我正在使用 Spring Boot 和 Spring Data JPA 创建一个简单的 Web 商店作为更大应用程序的一部分。我有许多物品(我的库存),订单将包含这些物品的集合(以及运输信息等)。
库存中的商品可能会更新 - 例如,更改价格。我希望能够在没有版本控制等开销的情况下做到这一点。但是,当我查看过去的订单时,我想获取当时使用的信息。
Spring Data JPA 中有没有办法在我的订单中嵌入项目的副本,而不是链接到项目对象?
我的课程如下:
ShopItem.java
@Entity
public class ShopItem {
@Id
@GeneratedValue
private Long id;
private String name;
private String description;
private int price;
private int stock;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public int getPrice() {
return price;
}
public void setPrice(int price) {
this.price = price;
}
public int getStock() {
return stock;
}
public void setStock(int stock) {
this.stock = stock;
}
public void reduceStock(int by){
this.stock = this.stock - by;
}
}
ShopOrder.java
@Entity
public class ShopOrder {
@Id
@GeneratedValue
private Long id;
@ManyToOne
private Member member;
private boolean postage;
@OneToMany
private List<ShopOrderItem> items;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Member getMember(){
return member;
}
public void setMember(Member member) {
this.member = member;
}
public boolean getPostage() {
return postage;
}
public void setPostage(boolean postage) {
this.postage = postage;
}
public List<ShopOrderItem> getItems() {
return items;
}
public void setItems(List<ShopOrderItem> items) {
this.items = items;
}
}
ShopOrderItem.java
@Entity
public class ShopOrderItem {
@Id
@GeneratedValue
private Long id;
@ManyToOne
private ShopItem item;
private int quantity;
public ShopOrderItem(ShopItem item, int quantity){
this.item = item;
this.quantity = quantity;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public ShopItem getItem() {
return item;
}
public void setItem(ShopItem item) {
this.item = item;
}
public int getQuantity() {
return quantity;
}
public void setQuantity(int quantity) {
this.quantity = quantity;
}
public int getTotalPrice(){
return item.getPrice() * quantity;
}
}
解决方案
当您使用 ORM 时,Spring Data JPA 只是一种让您的生活更轻松的方法。当您使用数据库时,ORM 只是让您的生活更轻松的一种方式。
问题是,如果您使用的是关系数据库,除了克隆数据之外,没有其他方法可以做您想做的事情。
因此,一种方法是克隆您的 ShopItem 实体并将其作为新条目存储在数据库中的专用表中。
另一种方法可能是使用可以更好地处理此问题的 NoSQL DB。
有许多不同的方法可以存储订单历史记录,但我想不出任何来自 Spring data JPA 的东西可以开箱即用。
推荐阅读
- android - 如何从 Android NDK C++ 代码中读取共享首选项?
- sql - SparkSQLContext 数据框基于列数组选择查询
- android - 如何在迁移现有应用程序以使用导航组件后确定 SharedViewModel 的范围
- cypress - 如何在 cypress 中模拟成功响应,仅当端点返回为 503 时?
- python - Tkinter 有没有办法在画布窗口中调整滚动条的大小
- python - 如何调试错误此文件“compiler.py”,第 8 行 f(n, m+1) = f(n-1, m) + f(n, m) + f(n+1, m) ^ SyntaxError:无法分配给函数调用
- arrays - C 快速声明和定义数组的字段
- r - 将列名与另一个数据框匹配并拆分为单独的数据框
- swiftui - 如何在 SwiftUI 中使用 VStack 作为 func 的输入?
- devops - 使用 codeship 使用 dockercfg 文件从 Github Conatiner Registry 拉取 docker 镜像