簡體   English   中英

如何更新JPA實體

[英]How to update JPA entities

我有一個網絡應用程序。 如果我不使用應用程序(命令行)對數據庫進行更改,則我的實體不會顯示此更改。

有沒有一種方法可以使實體知道數據已更改並且需要更新?

盡管可能不是最優雅的解決方案,但是您可以嘗試在實體管理器上調用refresh() 查看此答案: Java JPA-同步數據庫和實體

或者,您可以使用悲觀鎖來防止在使用實體時數據意外更改。

JPA不是數據庫觀察者,底層的JDBC也不是。 沒有從數據庫服務器通知您某些實體包含舊數據或不存在數據的方法。 知道的唯一方法是刷新或嘗試提交當前事務。

您的問題是您使用的是本地資源事務類型。 您必須設計事務begin()和commit()-技術上稱為事務划分。 如果EntityManager保持時間過長,可能會導致數據過時(例如您的投訴),甚至導致內存泄漏和性能下降。 您必須制定自己的事務管理策略。

另一方面,您可以通過開發類似GlassFish的應用程序服務器來省去頭疼的事情,將為通常由服務器注入的線程安全的EntityManager創建JTA事務類型。 這樣,您將保存所有事務處理。

我的說法是引用第294頁引號之后的JSR-317 JPA規范:

當在活動的JTA事務的范圍內調用容器管理的實體管理器時,將開始一個新的持久性上下文。持久性上下文已創建,然后與JTA事務關聯。 當關聯的JTA事務提交或回滾時,持久上下文結束,並且由EntityManager管理的所有實體都被分離。

請參閱我在這篇文章中的答案,以了解在GlassFish中設置JTA交易類型的步驟。

一個提示

如果您需要優先於應用程序外完成的數據庫更新,而不是當前EntityManager中的更新(即JTA事務)操作優先。 然后使用EntityManager.refresh()方法,該方法將丟棄您當前未完成的事務操作,直到調用refresh()並訴諸數據庫最新狀態為止。

暫無
暫無

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

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