[英]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.