2011-04-29 66 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();