2011-04-29 63 views
25

我有使用JPA的Web应用程序。这个实体管理器保留了大量的实体,并突然从另一端更新数据库。我使用MySQL和我使用PhpMyAdmin并更改一些行。EntityManager刷新

如何告诉实体管理器重新同步,例如,忘记缓存中的所有实体?

我知道有refresh(Object)的方法,但有没有可能如何做refreshAll()或什么导致这个?

它肯定这是昂贵的操作,但如果它必须完成。

回答

29
entityManager.getEntityManagerFactory().getCache().evictAll() 

Refresh是不同的东西,因为它修改你的对象。这一行将只是empty the cache,所以如果您获取在实体管理器外部更改的对象,它将执行实际的数据库查询,而不是使用过期的cached值。

+1

救了我的时间。非常感谢 !! – 2013-05-04 14:12:51

+1

我知道这是一个几岁,但我想把我的两分钱。我不完全确定这可以被称为答案。 evictAll()在您希望持久/合并新数据以忽略缓存内容并强制更新/插入数据库的情况下工作。但是,在首先后端数据库更改值的情况下,evictAll()不起作用(至少对我而言),然后您希望在从数据存储区拉出时更改显示。根据我的经验,缓存仍然会覆盖后端中更改的内容。 – 2016-08-01 19:51:04

2

那么,对于一些人(比如我)试图添加factory.getCache()。evictAll();并且不起作用,并且使用JPA + Hibernate,刷新查询添加提示org.hibernate.cacheModeIGNORE。例如:

em.createNamedQuery("SomeEntity.SomeNamedQuery") 
    .setHint("org.hibernate.cacheMode", "IGNORE") 
    .getResultList(); 
1

cache.evictAll不适用于我。所以要检索从另一个应用程序推送的数据,我做:

em.getTransaction().begin(); 
em.getTransaction().commit(); 

之后,我find查询检索刷新的数据。我不知道这是非常安全的解决方案,但它工作正常。

2

如果你正在使用的不是休眠的EclipseLink的提示是:

em.createNamedQuery("SomeEntity.SomeNamedQuery") 
.setHint(QueryHints.REFRESH, true) 
.getResultList();