我有兩個以一對一關系的模型。我在服務類中違背了其中一個模型的保存方法。但是當我通過 rest API 保存它們時,它正在不斷地追加相同的物件。
我有 2 個具有一對一關系的模型:Invoice 和 CustomerOrder。
發票模型
@Entity
public class CustomerOrder {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(nullable = true)
private LocalDate date;
@OneToOne(cascade = CascadeType.ALL, mappedBy = "customerOrder")
private Invoice invoice;
public Invoice getInvoice() {
return 發票。
}
public void setInvoice(Invoice發票) {
this.invoice = invoice;
}
....
和發票
@Entity
public class Invoice {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(recision = 8, scale = 2)
private BigDecimal amount;
private LocalDate issued;
private LocalDate due;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "order_id")
private CustomerOrder customerOrder。
public CustomerOrder getCustomerOrder() {
return customerOrder。
}
public void setCustomerOrder(CustomerOrder customerOrder) {
this.customerOrder = customerOrder;
}
...
還有我的服務保存方法
public void saveInvoice(Invoice發票,Long訂單_id) {
CustomerOrder customerOrder = customerOrderRepository.getById(order_id);
invoice.setCustomerOrder(customerOrder);
invoiceRepository.save(invoice);
}
控制器方法
public void saveInvoice( invoice, Long order_id) {
invoiceService.saveInvoice(invoice, order_id)。
}
但是在保存時,同一個物件被不斷地追加。
"id"。3,
"金額": 10.20,
"發行": "2020-09-20",
"到期": "2020-09-21",
"customerOrder": {
"id": 2,
"date": "2020-09-20",
"發票": {
"id": 3,
"金額": 10.20,
"發行": "2020-09-20",
"到期": "2020-09-21",
"customerOrder": {
"id": 2,
"date": "2020-09-20",
"發票": {
"id": 3,
"金額": 10.20,
"發行": "2020-09-20",
"到期": "2020-09-21",
"customerOrder": {
"id": 2,
"date": "2020-09-20",
"Invoice": { ....
繼續下去。
uj5u.com熱心網友回復:
這里實際發生了什么:
CustomerOrder物體有一個Invoice的屬性,名為invoice。Invoice物體有一個CustomerOrder的屬性,名為customerOrder. 。
當jackson序列化器嘗試序列化這個CustomerOrder時,它看到它有一個invoice屬性,這個屬性里面也有customerOrder。雖然只有兩個customerOrder & invoice的物件相互參考,但在序列化時,它遞回下去了。
解決方案:
使用@JsonIgnore:
在cusotmerOrder物體的cusotmerOrder屬性上放置一個@JsonIgnore,這將防止在Invoice物體內序列化customerOrder。
優點。更少的開銷 缺點:不能動態地控制何時序列化到哪個級別。
使用@JsonIgnore或使用一對@JsonBackReference & @JsonManagedReference有類似的缺點。
其他:
對于動態控制不同回應的深度(對于不同的路由),你可以選擇@JsonView或@JsonFilter。
使用實體:
uj5u.com熱心網友回復:
@OneToOne對于關系來說不是最好的選擇,因為它限制了LAZY加載物體。而且你在關系的兩邊都有CascadeType.ALL,這可能會導致一些問題。將關系改為@OneToMany one CustomerOrder和many Invoice,并放棄級聯。首先保存CustomerOrder,然后保存Invoice。但如果你想使用@OneToOne,請查看注解@MapsId https://vladmihalcea.com/the-best-way-to-map-a-onetoone-relationship-with-jpa-and-hibernate/
在REST api中直接使用物體作為RequestBody不是好的做法。嘗試使用InvoiceRequest類作為輸入,InvoiceDTO作為輸出,將視圖和業務邏輯分開。這也將解決杰克遜的序列化/反序列化問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/324178.html
標籤:
上一篇:關閉已打開的Excel視窗VBA
