首页 > 解决方案 > 在 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;
  }
}

标签: javaspringhibernatespring-data-jpa

解决方案


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

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

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

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

有许多不同的方法可以存储订单历史记录,但我想不出任何来自 Spring data JPA 的东西可以开箱即用。


推荐阅读