java在Spring数据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;
}
}
商店订单。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;
}
}
# 1 楼答案
当你使用ORM时,Spring Data JPA只是让你的生活更轻松的一种方式。当你使用数据库时,ORM只是让你的生活更轻松的一种方式
问题是,如果您使用的是关系数据库,那么除了克隆数据之外,没有其他方法可以做您想要做的事情
因此,一种方法是克隆ShopItem实体,并将其作为新条目存储在专用表中的数据库中
另一种方法可能是使用NoSQL DB,它可以更好地处理这个问题
有很多不同的方法来存储订单历史记录,但我想不出Spring data JPA中有什么方法可以做到开箱即用