EntityManager refresh

泄露秘密 提交于 2019-11-28 18:40:35
Rasmus Franke
entityManager.getEntityManagerFactory().getCache().evictAll()

Refresh is something different since it modifies your object. This line will just empty the cache, so if you fetch objects changed outside the entity manager, it will do an actual database query instead of using the outdated cached value.

Arnold

I had a similar issue and the evictAll() line above worked for me.

Alternatively, the @Cache annotation on the entity class worked too, with the benefit of being able to control caching parameters:

@Cache(coordinationType=CacheCoordinationType.INVALIDATE_CHANGED_OBJECTS)

See: http://wiki.eclipse.org/EclipseLink/Examples/JPA/Caching

Well, for some people (like me) that tried to add factory.getCache().evictAll(); and doesn't work, and are used JPA + Hibernate, to refresh a query add the hint org.hibernate.cacheMode to IGNORE. Example:

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

cache.evictAll is not working for me. So to retrieve data pushed from another app, I peform :

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

After that, my find query retrieves refreshed data. I don't know if it's very safe solution but it works properly.

If you are using EclipseLink instead of Hibernate the hint is:

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

When you read an object into an EntityManager, it becomes part of the persistence context, and the same object will remain in the EntityManager until you either clear() it and get a new EntityManager. So if you update the database, the EntityManager will not see the change unless you call refresh() on the object, or clear() the EntityManager. This has nothing to do with the shared cache (L2) or the persistence context (L1). If you also also using a shared cache, and updating the database directly, then your shared cache will be out of date. You need to refresh() the object, or mark it as invalid to be refreshed the next time it is queried.

Code must follow the way like. DETACH REFRESH MERGE FLUSH

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!