簡體   English   中英

休眠:如何保留與訂單相關的信息

[英]Hibernate: How do I persist order related information

在我的應用程序中,用戶下訂單並將賬單地址設置為與他映射的地址之一。 現在他將來會編輯該地址。因此我的訂單將映射到該更新的地址。

我的訂單實體

@Entity
public class Orders{
...

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private User user;

@OneToOne
private Address address;
...
}

地址實體

@Entity
@Table(name = "address")
public class Address {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

private String address1;

...

}

人實體

@Entity
public class Person{
...
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
private Set<Address> addresses = new HashSet<>();
...
}

我希望我的Order實體擁有創建訂單時的地址副本。創建訂單后,用戶在個人資料中對Address所做的任何更改都不應對該訂單產生影響。

我假設您允許用戶從他的地址列表(Person#address)中選擇地址,因此在提交訂單時,它包含數據庫中已經存在的地址,包括創建關系的id ,不會創建記錄:

{
  user: {
    id: 10,
    email: "user@stackoverflow.com"
  },
  address: {
    id: 10,
    street: "5th Av"
  }
}

如果要“ 具有地址的副本 ”,則應首先在Order類中更新關系,例如:

  @OneToOne(cascade = CascadeType.ALL)
  private Address address;

然后發送不帶id的地址,這將指示您的存儲庫要在數據庫中創建一個新條目。

Json選項:

{
  user: {
    id: 10,
    email: "user@stackoverflow.com"
  },
  address: {
    street: "5th Av", ...
  }
}

或通過刪除控制器上的id

@PostMapping("/submit-order")
public Order submitOrder( @RequestBody Order order) {
  // Remove Order#id to detatch current record and enforce create a new one
  order.getAddress().setId(null);
  return this.orderRepository.save(order);
}

這樣,您的訂單就有地址的唯一副本。

錯誤:消息為“地址從1更改為null”的org.springframework.orm.jpa.JpaSystemException

如果收到此錯誤是因為要在事務或會話范圍內刪除實體的ID。 您應該在該范圍之外創建實體的副本,或者使用實體管理器分離實體,這是一個示例

@嵌入式解決方案

另一種解決方案是改為使用可嵌入對象,這樣您可以將地址字段存儲在訂單表上,但可以將它們作為復合對象:

首先,使用所有必填字段創建一個訂單地址對象,並使用@Embeddable批注對其進行標記:

@Embeddable
public class AddressOrder {
  @Column("street")
  private String street;
  @Column("postal_code")
  private String po;
  @Column("city")
  private String city;
  @Column("country")
  private String country;

  // Getters and setters
}

然后,將訂單表上的對象用作屬性,並使用@Embedded批注對其進行標記。

@Entity
public class Orders {
  @ManyToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "user_id")
  private User user;

  @Embedded
  private AddressOrder address;

  // Getters and setters
}

您需要根據要使用的數據庫方法選擇解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM