我有使用JPA的Web应用程序。这个实体管理器保留了大量的实体,并突然从另一端更新数据库。我使用MySQL和我使用PhpMyAdmin并更改一些行。EntityManager刷新
如何告诉实体管理器重新同步,例如,忘记缓存中的所有实体?
我知道有refresh(Object)
的方法,但有没有可能如何做refreshAll()
或什么导致这个?
它肯定这是昂贵的操作,但如果它必须完成。
我有使用JPA的Web应用程序。这个实体管理器保留了大量的实体,并突然从另一端更新数据库。我使用MySQL和我使用PhpMyAdmin并更改一些行。EntityManager刷新
如何告诉实体管理器重新同步,例如,忘记缓存中的所有实体?
我知道有refresh(Object)
的方法,但有没有可能如何做refreshAll()
或什么导致这个?
它肯定这是昂贵的操作,但如果它必须完成。
entityManager.getEntityManagerFactory().getCache().evictAll()
Refresh
是不同的东西,因为它修改你的对象。这一行将只是empty the cache
,所以如果您获取在实体管理器外部更改的对象,它将执行实际的数据库查询,而不是使用过期的cached
值。
我有一个类似的问题,并evictAll()
行上面为我工作。
另外,在@Cache
注释的实体类的工作也具有能够控制缓存参数的好处:
@Cache(coordinationType=CacheCoordinationType.INVALIDATE_CHANGED_OBJECTS)
那么,对于一些人(比如我)试图添加factory.getCache()。evictAll();并且不起作用,并且使用JPA + Hibernate,刷新查询添加提示org.hibernate.cacheMode到IGNORE。例如:
em.createNamedQuery("SomeEntity.SomeNamedQuery")
.setHint("org.hibernate.cacheMode", "IGNORE")
.getResultList();
cache.evictAll不适用于我。所以要检索从另一个应用程序推送的数据,我做:
em.getTransaction().begin();
em.getTransaction().commit();
之后,我find查询检索刷新的数据。我不知道这是非常安全的解决方案,但它工作正常。
如果你正在使用的不是休眠的EclipseLink的提示是:
em.createNamedQuery("SomeEntity.SomeNamedQuery")
.setHint(QueryHints.REFRESH, true)
.getResultList();
救了我的时间。非常感谢 !! – 2013-05-04 14:12:51
我知道这是一个几岁,但我想把我的两分钱。我不完全确定这可以被称为答案。 evictAll()在您希望持久/合并新数据以忽略缓存内容并强制更新/插入数据库的情况下工作。但是,在首先后端数据库更改值的情况下,evictAll()不起作用(至少对我而言),然后您希望在从数据存储区拉出时更改显示。根据我的经验,缓存仍然会覆盖后端中更改的内容。 – 2016-08-01 19:51:04