我們有一個用戶可以對對象(如:公司)進行更改的頁面。這個對象具有通用字段(例如:名稱,日期等)以及一些@OneToMany註釋(地址,電話號碼等)。Spring JPA在一次調用中實現「保存更改」
我們的要求是允許用戶對前端進行更改,然後單擊按鈕後保存這些更改。我們面臨的問題是更新OneToMany關係。
考慮以下情形:
用戶提出了改變現有的地址(ID:1),他們創造一個新的地址(無ID項),他們刪除現有地址(在請求中不可見) 。
命中後端請求數據:
{
id: 1,
name: "Edited company name",
addresses: [
{
id: 1,
name: "modified address",
line1: "12 Main street"
},
{
name: "This is a new address without an id",
line1: "5 Someother Street",
}
]
}
默認情況下,我們有2種選擇:
選項1:
Spring配置:
@OneToMany(fetch = FetchType.LAZY, mappedBy = "company", orphanRemoval = true)
@Cascade(org.hibernate.annotations.CascadeType.ALL)
使用此配置,刪除的地址不是JSON的一部分,因此「orphanRemoval」選項可確保所有未在JSON中傳遞的地址都將被刪除。這裏的問題是,沒有辦法指定只刪除一個地址,而不是刪除所有不屬於JSON的公司地址。
選項2:
Spring配置:
@OneToMany(fetch = FetchType.LAZY, mappedBy = "company")
@Cascade(org.hibernate.annotations.CascadeType.ALL)
的orphanRemoval選項爲false此處(即未設置)。所以這意味着新的地址被創建,現有的地址被更新,但沒有被刪除。
所以我的問題是:是否有一個更好的/默認的方式來實現這個在Spring中,或者我們手動需要跟蹤已刪除的項目,並實現我們自己的邏輯,以確保只有我們要刪除的項目是確實刪除了?
P.S.
我意識到這一切都可以通過簡單地進行DELETE調用並在點擊按鈕後刪除地址來解決,但這裏的想法是我們只在用戶點擊「SAVE」之後進行數據庫調用,它應該將所有更改發送到服務器一次。我們不能使用DELETE調用,因爲如果用戶決定點擊「取消」而不保存更改,則無法恢復這些調用。