繁体   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