2009-09-23 43 views
5

有在ejb-3_0-FR-SPEC-persistence.pdf读取JPA:如何将持久化上下文与批量更新或删除的结果进行同步?

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

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

那么有没有一个(很好\简单\通用)同步JPA的缓存与批量更新\删除的结果?

顺便说一句。我使用EclipseLink,版本:Eclipse持久性服务 - 1.1.0.r3634。

谢谢,

菲尔。

+1

我相信有一个[http://stackoverflow.com/questions/5832415/entitymanager-refresh][1]。它实际上对我有效。 [1]:http://stackoverflow.com/questions/5832415/entitymanager-refresh – 2011-07-28 16:36:29

回答

5

您必须小心如何使用“缓存”这个词,因为这可能意味着不同的事情。

突出显示的短语讲述持久化上下文,可以将其视为“第一级高速缓存”。为了从数据库您可以将最新的变化来更新它:

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

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

1

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

下跌舒服,在这里把我打倒在http://puspendu.wordpress.com/2010/12/22/sync-jpa-database-multiple-application/

4

这是你如何清除缓存数据。

entityManager.getEntityManagerFactory().getCache().evictAll(); 
+0

怎么样的表现继续这样的时候? – 2015-04-29 09:21:11

1

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

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