如何更新JPA实体

时间:2012-11-16 22:15:56

标签: java java-ee jpa persistence

我有一个网络应用程序。如果我不使用应用程序(命令行)对数据库进行更改,我的实体不会显示此更改。

有没有办法让实体意识到数据已经发生了变化并需要更新?

3 个答案:

答案 0 :(得分:0)

虽然可能不是最优雅的解决方案,但您可以尝试在实体管理器上调用refresh()。请参阅此答案:Java JPA - Sync Database and Entity

或者,您可以使用pessimistic locks来防止数据在使用实体时意外更改。

答案 1 :(得分:0)

JPA不是数据库观察者,而且底层JDBC不是一个。没有从数据库服务器通知您的某些实体包含旧数据或不存在数据的方法。知道的唯一方法是刷新或尝试提交当前事务。

答案 2 :(得分:0)

您的问题是您使用的是资源本地事务类型。您有义务设计事务begin()和commit() - 技术上命名的事务划分。如果EntityManager保持时间过长,则可能导致陈旧数据(如投诉中)或甚至内存泄漏和性能不佳。您必须制定自己的交易管理政策。

另一方面,您可以通过开发像GlassFish这样的应用程序服务器来避免头痛,将为线程安全的EntityManager创建JTA事务类型,这通常由服务器注入。因此,您将保存所有事务管道。

我的论点引用了JSR-317 JPA规范,引用了第294页:

  

当在活动JTA事务的范围内调用容器管理的实体管理器时,将开始新的持久性上下文...创建持久性上下文,然后将其与JTA事务关联。   当关联的JTA事务提交或回滚时,持久性上下文结束,并且由EntityManager管理的所有实体都将分离。

请参阅my answer in this post for the steps to setup a JTA transaction type in GlassFish.

一个提示

如果您需要优先考虑在您的应用程序之外完成的数据库更新,而不是当前EntityManager中的更新 - 这意味着JTA事务 - 操作。然后使用EntityManager.refresh()方法丢弃当前未完成的事务操作,直到refresh()调用并转到DB最新状态。