2014-01-22 142 views
6

首先解釋上下文。我有通過JMS訪問的後端Java(Spring/Hibernate)應用程序。我有通過Url訪問的客戶端應用程序(RESTfull)。我有一個擁有多個列表的複雜實體(大部分是懶惰的),並且這個實體是xy其他實體的組合。什麼是安全更新hibernate實體的最佳方法?

問題:由於我通過URL訪問它,因此我從URL參數中創建客戶端應用程序中的Java對象。我通過JMS發送它到後端,但在後端,我沒有Hibernate對象,所以我不能簡單地合併它。

我可以走線槽一切從客戶喜歡傳來:

  • 通過id來獲取Hibernate對象的
  • 檢查所不同的是
  • 設置新值
  • 更新

和重複它爲每個組合實體,但我想知道是否有更優雅和「易於維護」的方式來更新此實體的所有 變化。

我希望我解釋得很好。提前致謝!

+1

如果您有'id'。做save​​OrUpdate()'有什麼問題? –

+0

問題是我沒有全部信息。我沒有有效的Hibernate對象狀態。如果我有10個字段並只更改field1,我的對象將填充id和field1。其餘的都是空的。如果我保存/更新,我將丟失所有其他數據。 –

+0

是的,我明白了。然後我擔心,你正在做正確的步驟。 :P –

回答

2

從你的描述看來,你所遵循的步驟是正確的。第一個(獲取對象)和最後一個(更新對象)步驟是不可避免的。您可以優化的唯一地方是檢查/設置部分。爲此,您可以編寫一個通用方法,它接受兩個對象並使用反射比較它們的變化。這樣它可以再次使用。

以下是使用反射的示例code。將其更改爲適合您的需要

+0

謝謝Sandeep,在我看來,這是唯一的方法。我已經實施了類似的東西。 –

0

如果您確信自己已經擁有修改實體字段的最新值(例如通過保留樂觀鎖定版本字段)和/或您打算只覆蓋所有修改後的字段,則無需檢查如果這些字段被更改或不。只需找到實體並設置您擁有的字段(包括ID和版本),Hibernate就會覆蓋您對數據庫的更改(如果有的話),除非在此期間某個實體已被其他線程修改。在這種情況下,更新/合併由於樂觀鎖定異常而失敗。

所以步驟將成爲:

  • 查找的Hibernate對象的ID
  • 設置新的/修改後的值包括版本
  • 更新/合併/堅持

當然,你需要以確保您的實體關係具有適當的級聯或爲每個相關實體逐個更新實體。

+0

正如我所說的問題,主要的問題是,我沒有所有的價值觀,因爲我從網址參數只有什麼應該改變... –

+0

對不起,我誤解了你的問題。我更新了我的答案以澄清。 –

相關問題