5

ejb-3_0-fr-spec-persistence.pdf 中有一个声明,内容如下

持久化上下文与批量更新或删除的结果不同步

因此,如果我执行从表中删除行的 query.executeUpdate。这些相同的行仍然存在于另一个实体的一对多集合中。当我重新启动应用程序时,我看到幻影实体现在已从集合中删除。

那么有没有一种(不错的\简单\通用)方式将 JPA 的缓存与批量更新\删除的结果同步?

顺便提一句。我正在使用 EclipseLink,版本:Eclipse Persistence Services - 1.1.0.r3634。

谢谢,

菲尔。

4

4 回答 4

5

你必须小心你在这里如何使用“缓存”这个词,因为它可能意味着不同的东西。

突出显示的短语谈论持久性上下文,可以将其视为“一级缓存”。为了使用数据库中的最新更改对其进行更新,您可以:

  1. 调用EntityManager.refresh()来刷新单个实体的状态。
  2. 或者完全丢弃实体管理器实例(在适当的刷新/清除更改之后)并从实体管理器工厂获取一个新实例。您从这个新实例中加载的任何实体都将从数据库中加载,因此包含最新的更改。

然后可能还有一个“二级缓存”,它不绑定到特定的实体管理器。您可以使用它自己的 API(不同的缓存提供程序)刷新它(或者,更确切地说,清除并让它重新填充自己)。

于 2009-09-23T22:25:25.457 回答
4

这是您清除缓存数据的方式。

entityManager.getEntityManagerFactory().getCache().evictAll();
于 2011-09-12T19:47:49.027 回答
1

一级缓存(EntityManager/transaction)需要手动刷新或清除。您可以刷新对象、调用 clear() 或获取新的 EntityManager。

当您提交事务时,二级缓存(共享缓存)应该会自动失效。如果不是出于某种原因,那么您可以使用 JPA Cache API 或 EclipseLink JpaCache API 来驱逐或使对象无效,或者您可以刷新它们。


于 2011-09-13T13:46:34.717 回答
1

持久性上下文不会更新以反映更新和删除操作的结果。如果您使用事务范围的持久性上下文,您应该在事务中单独执行批量操作,或者成为事务中的第一个操作(请参阅 EclipseLink 事务简介)。这是因为任何由持久性上下文主动管理的实体都不会意识到数据库级别发生的实际更改。

在http://puspendu.wordpress.com/2010/12/22/sync-jpa-database-multiple-application/上敲我这里很舒服

于 2010-12-24T17:21:16.300 回答