我正在使用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;
}
}
答案 0 :(得分:1)
Spring Data JPA仅是使您使用ORM时更轻松的方法。而ORM只是使您使用数据库时生活更轻松的一种方法。
问题是,如果您使用的是关系数据库,则除了克隆数据外,没有其他方法可以做您想做的事情。
因此,一种方法是克隆ShopItem实体,并将其作为新条目存储在专用表中的数据库中。
另一种方法可能是使用NoSQL DB,它可以更好地处理此问题。
有很多不同的方式来存储订单历史记录,但是我想不到Spring数据JPA可以开箱即用的任何东西。