簡體   English   中英

事務提交后實體未保存

[英]Entity not getting saved after transaction commit

在某些背景下,我在Web應用程序中使用JPA / Hibernaate / Spring,也使用org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter和擴展的持久性上下文來處理我的實體。

問題:

  1. 用戶單擊實體的編輯鏈接

  2. 使用查找方法從數據庫中加載實體,並將實體存儲在會話中

  3. 用戶對實體進行更改並點擊保存

  4. 用戶更改反映在會話中存儲的實體中(在控制器中)

  5. 實體被發送到服務類中的方法(以@Transactional注釋)

  6. 服務類中沒有對實體(或任何其他實體)進行任何更改(它做了一些其他與持久性無關的工作)

  7. 服務方法完成后,沒有任何更改會刷新到數據庫!

注意:服務類是一個Spring組件,我調試了為其創建的spring代理,當調用以@Transactional注釋的服務方法時,我看到spring在服務方法調用之前創建了一個NEW事務,並且我也看到它成功地提交了事務。 根據我的理解,即使對實體的更改沒有在事務邊界中發生,也應該將其刷新到數據庫中。 為什么更改沒有被刷新?!

對於要刷新的實體,必須對其進行管理。 該實體可能是分離的。

我可以想到在這種情況下將其分離的兩個可能原因:

  1. 即使對於擴展的持久性上下文,也將創建並關閉實體管理器。 也許您在每次調用服務器時都將其打開和關閉? 然后,由於您嘗試將實體保存在與創建該實體的服務器不同的服務器調用中,因此實體管理器是新的,因此不管理該實體。

  2. 實體在服務器的那些調用之間被序列化。 當實體被序列化時,它變得分離。 這很容易發生,因為服務器經常在兩次調用之間將會話數據寫入磁盤。

如果用戶更改是在服務層外部進行的,則除非您在服務層內部調用persist,否則更改不會自動保留:

entityManager.persist()

並且您可以在這里看到為什么在合並中使用持久化。

我希望這會有所幫助。

暫無
暫無

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

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