有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

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

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

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

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

    有很多不同的方法来存储订单历史记录,但我想不出Spring data JPA中有什么方法可以做到开箱即用