我有使用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