當存在具有相同主鍵的現有實體時,如果試圖將實體合併到數據庫中,則會出現primaryKeyUpdateDisallowed ValidationException
。JPA EntityManager合併異常
當然,當我執行TypedQuery
並讓實體管理器首先返回實體,更新適當的值,然後合併時,我不會得到例外。問題是這個過程太昂貴,資源明智。我需要能夠簡單地合併而不會產生異常。
有沒有一種方法來構造我們的實體類,以便我們可以覆蓋記錄,包括主鍵?或者以其他方式解決問題?
當存在具有相同主鍵的現有實體時,如果試圖將實體合併到數據庫中,則會出現primaryKeyUpdateDisallowed ValidationException
。JPA EntityManager合併異常
當然,當我執行TypedQuery
並讓實體管理器首先返回實體,更新適當的值,然後合併時,我不會得到例外。問題是這個過程太昂貴,資源明智。我需要能夠簡單地合併而不會產生異常。
有沒有一種方法來構造我們的實體類,以便我們可以覆蓋記錄,包括主鍵?或者以其他方式解決問題?
在JPA,如果你希望做的事:
entityManager.merge(someEntity);
,那麼你必須先通過「entityManager.detach(someEntity)」或通過清除數據庫加載到了EntityManager持久化上下文someEntity然後分離持久性上下文。如果someEntity沒有預加載和分離,而是通過「new SomeEntity()」創建的,則merge()函數將確定您添加了一個新實體並執行與entityManager.persist非常相似的內部操作someEntity)。當數據在事務中刷新或提交時,它將生成一個SQL INSERT,它將與先前存在的PK衝突。
下面是來自JPA 2規格指定的行爲:
應用到實體X合併操作的語義如下:
>問題是這個過程是太昂貴,資源明智的。我需要能夠簡單地合併而不會產生異常。
這不應該是這種情況。從DB中檢索實體或實體列表應該是有效的。可能你的查詢可以改進。你在查詢中有「where」子句嗎?在刷新過程中是否有很多實體級聯(通過屬性級聯= CascadeType.REFRESH/ALL關係,如@OneToMany或@ManyToOne)?你有一個非常複雜的繼承層次與許多實體/表?如果你可以提供你的JPQL或標準查詢,我相信這個問題很容易解決。 :-)
向我們顯示您的代碼。這個異常表明你試圖改變一個持久化實體的PK的值,這是被禁止的。 –