簡體   English   中英

在不更新數據庫的情況下合並/重新連接IN JPA / Hibernate

[英]merging / re-attaching IN JPA / Hibernate without updating the DB

在OSIV Web環境中使用JPA / Hibernate使我發瘋;)

以下情況:我有一個通過JPA加載的實體A,並且有一個B實體的集合。 這些B實體具有必填字段。

當用戶通過按下Web應用程序中的鏈接將新的B添加到A時,未設置必填字段(因為沒有明智的默認值)。

在下一個http請求時,OSIV篩選器嘗試合並A實體,但這失敗,因為Hibernate抱怨新的B的必填字段未設置。

javax.persistence.PersistenceException: org.hibernate.PropertyValueException: not-null property references a null or transient value

閱讀JPA規范,我看不到在合並階段需要進行這些檢查的跡象(我沒有活動的事務)

我不能將B的集合保留在A之外,而僅當用戶按下“保存”(又名entitymanager.persist())時將它們添加到A中,因為保存按鈕所在的位置不知道B的地方,只知道一種。

另外,A和B只是示例,我到處都有類似的內容。

有任何想法嗎? 其他JPA實現在這里的行為是否相同?

提前致謝。

我做了很多閱讀和測試。 問題來自我對JPA / Hibernate的誤解。 merge()總是會對數據庫產生影響,並且還會為實體安排更新。 在JPA規范中,我沒有提到這一點,但是“帶有Hibernate的Java持久性”書中確實提到了這一點。

通過EntityManager(和Session作為后備)API查看,似乎沒有辦法在不安排更新的情況下僅將實體分配給當前持久性上下文。 畢竟,我要導航的是對象圖,根據需要更改屬性,然后稍后觸發更新(如果需要,請進行版本檢查)。 我認為使用ORM的每個Web應用都必須做什么?

我正在尋找的基本工作流程:

  1. 從數據庫加載一個實體(或創建一個新實體)
  2. 讓實體(及其所有關聯變為分離)(因為EntitManager在HTTP請求結束時關閉)
  3. 當下一個HTTP請求進入時,再次使用這些對象,在樹中導航,而不必擔心LazyInitExceptions
  4. 調用一種方法,該方法將保留在1-3期間所做的所有更改)

結合Spring的OSIV過濾器和wicket的IModel實現,我認為我已經對此進行了歸檔。

我基本上看到了兩種可能的解決方法:

a)進入特定頁面(用例)時,加載實體和所需的所有關聯,讓它們分離,並在幾個http請求過程中根據需要添加/更改它們。 比用戶啟動保存時重新附加它們(驗證程序將確保狀態有效)並將它們提交到數據庫。

b)使用當前設置,但請確保所有新添加的實體均設置了其所有必填字段(可能使用某些向導組件)。 對於每個merge(),我仍將具有數據庫的所有更新,但是希望數據庫管理員不會意識到;)

其他人如何在Web環境中使用JPA? 還有其他選擇嗎?

暫無
暫無

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

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