我正在JPA中使用EclipseLink並調用EntityManager.merge()
來插入/更新數據庫中的記錄。記錄來自外部系統,所以我無法判斷它們是新的還是現有的更新。如何判斷JPA EntityManager.merge是否正在執行插入操作或更新
有沒有什麼辦法可以知道當我打電話給merge()
時JPA執行什麼樣的操作(插入/更新)?
我正在JPA中使用EclipseLink並調用EntityManager.merge()
來插入/更新數據庫中的記錄。記錄來自外部系統,所以我無法判斷它們是新的還是現有的更新。如何判斷JPA EntityManager.merge是否正在執行插入操作或更新
有沒有什麼辦法可以知道當我打電話給merge()
時JPA執行什麼樣的操作(插入/更新)?
首先,這種行爲對你來說是透明的,所以在引擎蓋下做什麼合併不會直接告訴你。
但是由於您沒有提供有關合並操作的詳細信息,因此我很難想象您有哪些用例,哪些用戶不知道是否更新或插入。在這方面的問題將是
手動標識,沒有版本列,只有單個實體。用例是第三方系統發送一個包含更新和新記錄的json到我的REST應用程序,我需要標記新的和更新的記錄,因爲這個應用程序需要與另一個服務器保持同步。我在每個表中都有一個新的,更新和刪除列,所以如果插入記錄,我需要將new設置爲true,如果更新,則將其更新爲true。 – momo
在這種情況下,我認爲你所能做的就是通過ID選擇每條記錄,然後相應地設置你的標誌列。 –
我也想回答這個問題。
我可以想象很多情況下,我需要檢查對象是否存儲新記錄或現有記錄的值。
爲了縮短歷史記錄,我從外部來源(文件,REST,無論什麼)獲取記錄,我需要知道何時將業務驗證應用於某種形式,並在每種情況下也觸發正確的操作。
在幾篇文章中找到的默認解決方案是使用自動生成的ID字段。
當我有一個自動生成的ID我可以檢查它的值是否爲空(id在註冊表包含中自動初始化,並在從數據庫中獲取數據時返回填充)。但是,如果我沒有自動生成的ID,或者當它是註冊表包含但其值已被應用程序或外部源非正確初始化時,此邏輯不適用(失敗)。
我已經完成了對每個記錄處理的數據庫的查詢,但是這會造成不必要的過多讀取。
另一種方式(需要更多測試)是在稱爲isNew的實體中創建一個瞬態屬性。在構造函數中使用true值初始化,在@PostLoad方法中使用false。當記錄是新的時,構造函數會將對象標記爲isNew = true;當它被讀取時,@PostLoad將標記isNew = false。
這可能是您的解決方案,或者有人可以告訴我們一個更好的方法來做這個驗證。
爲了確保發生了什麼,您可以啓用jpa提供程序日誌來查看sql查詢。 – landal79