【问题标题】:JPA: How do I synchronize the persistence context with the result of the bulk update or delete?JPA:如何将持久性上下文与批量更新或删除的结果同步?
【发布时间】:2010-11-30 22:04:05
【问题描述】:

在 ejb-3_0-fr-spec-persistence.pdf 中有一条声明

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

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

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

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

谢谢,

菲尔。

【问题讨论】:

标签: java jpa eclipselink


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

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


        【讨论】:

          猜你喜欢
          • 2013-04-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-22
          • 2023-03-18
          • 1970-01-01
          • 2016-04-10
          相关资源
          最近更新 更多