EntityManager刷新

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

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

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

这肯定是昂贵的操作,但如果必须这样做。

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

Refresh是不同的,因为它修改了您的对象 。 此行将empty the cache ,因此,如果您获取在实体管理器外部更改的对象,它将执行实际的数据库查询,而不是使用过时的cached值。

我有一个类似的问题,上面的evictAll()行为我工作。

或者,实体类上的@Cache注释也可以工作,并且能够控制缓存参数:

 @Cache(coordinationType=CacheCoordinationType.INVALIDATE_CHANGED_OBJECTS) 

请参阅: http : //wiki.eclipse.org/EclipseLink/Examples/JPA/Caching

好吧,对于一些试图添加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(); 

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

如果您使用的是EclipseLink而不是Hibernate,则提示是:

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

当您将对象读入EntityManager时,它将成为持久化上下文的一部分,并且同一个对象将保留在EntityManager中,直到您清除()它并获取新的EntityManager。 因此,如果更新数据库,除非您在对象上调用refresh()或清除()EntityManager,否则EntityManager将看不到更改。 这与共享缓存(L2)或持久性上下文(L1)无关。 如果您还使用共享缓存并直接更新数据库,那么您的共享缓存将过时。 您需要刷新()对象,或将其标记为无效,以便在下次查询时刷新。

代码必须遵循这样的方式。 DETACH REFRESH MERGE FLUSH