Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA:如何将持久性上下文与批量更新或删除的结果同步?_Java_Jpa_Eclipselink - Fatal编程技术网

Java JPA:如何将持久性上下文与批量更新或删除的结果同步?

Java JPA:如何将持久性上下文与批量更新或删除的结果同步?,java,jpa,eclipselink,Java,Jpa,Eclipselink,ejb-3_0-fr-spec-persistence.pdf中有一条语句 持久性上下文与批量更新或删除的结果不同步 因此,如果我执行query.executeUpdate,它将从表中删除行。这些行仍然存在于另一个实体的一对多集合中。当我重新启动应用程序时,我看到幻影实体现在已从集合中删除 那么,有没有一种(好的\简单的\通用的)方法可以将JPA的缓存与批量更新\删除的结果同步呢 顺便说一句,Im使用EclipseLink,版本:EclipsePersistenceServices-1.1.0.

ejb-3_0-fr-spec-persistence.pdf中有一条语句

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

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

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

顺便说一句,Im使用EclipseLink,版本:EclipsePersistenceServices-1.1.0.r3634

谢谢


菲尔。

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

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

  • 调用以刷新单个实体的状态
  • 或者完全放弃entity manager实例(根据需要刷新/清除更改后),并从entity manager工厂获取一个新实例。从这个新实例中加载的任何实体都将从数据库中加载,因此包含最新的更改

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

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


    在这里敲我一下感觉很舒服这就是清除缓存数据的方法

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

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


    我相信有一个[.它实际上对我有用。[1]: