2016-04-30 50 views
0

我們有一個用戶可以對對象(如:公司)進行更改的頁面。這個對象具有通用字段(例如:名稱,日期等)以及一些@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調用,因爲如果用戶決定點擊「取消」而不保存更改,則無法恢復這些調用。

回答

0

簡而言之:按預期使用jpa並根據您的業務需求設置orphanRemoval。如果您的域模型中的地址只能存在於公司的上下文中,那麼您希望保留orphanRemoval標誌。如果沒有,你應該把它設置爲false。

我用你的方法看到的問題是,你想將對象從瀏覽器合併到持久層。要做到這一點,你必須在json請求中傳輸修改過的公司的所有地址。

最簡潔的方法是引入DTO將域名模型中的webapi分離出來。這樣,當您的json請求到達服務器時,您可以加載域名對象,使用jpa進行修改,並在一個域中進行必要的修改交易。在提交時將這些更改寫回數據庫。

相關問題