在Spring Data JPA中嵌入对象而不是链接

时间:2019-09-15 10:54:11

标签: java spring hibernate 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;
  }
}

1 个答案:

答案 0 :(得分:1)

Spring Data JPA仅是使您使用ORM时更轻松的方法。而ORM只是使您使用数据库时生活更轻松的一种方法。

问题是,如果您使用的是关系数据库,则除了克隆数据外,没有其他方法可以做您想做的事情。

因此,一种方法是克隆ShopItem实体,并将其作为新条目存储在专用表中的数据库中。

另一种方法可能是使用NoSQL DB,它可以更好地处理此问题。

有很多不同的方式来存储订单历史记录,但是我想不到Spring数据JPA可以开箱即用的任何东西。