簡體   English   中英

安全更新休眠實體的最佳方法是什么?

[英]What is the best way to safely update hibernate entity?

首先解釋一下上下文。 我有可以通過JMS訪問的后端Java(Spring / Hibernate)應用程序。 我有可通過網址訪問的客戶端應用(RESTfull)。 我有一個復雜的實體,其中有多個列表(大多數是惰性的),並且這個實體是xy其他實體的組成。

問題:因為我通過URL訪問它,所以我在URL地址參數的客戶端應用程序中創建Java對象。 我通過JMS將其發送到后端,但是在后端,我沒有Hibernate對象,因此無法簡單地合並它。

我可以瀏覽所有來自客戶的信息,例如:

  • 通過ID獲取休眠對象
  • 檢查有什么不同
  • 設定新的價值
  • 更新

並針對每個合成實體重復此操作,但我想知道是否存在更優雅且“易於維護”的方式來通過所有更改來更新此實體。

我希望我能解釋清楚。 提前致謝!

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

這是使用反射的示例代碼 根據您的需要進行更改

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

因此,步驟將變為:

  • 通過ID查找Hibernate對象
  • 設置新的/修改的值,包括版本
  • 更新/合並/持久

當然,您需要確保您的實體關系上具有適當的級聯,或者對於每個相關的實體一個一個地更新實體。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM