2010-11-15 65 views

回答

11

您的意思是第一級緩存還是第二級緩存?使用Hibernate二級高速緩存(如Ehcache)高速緩存與您手動修改的同一表中的行對應的實體可能會導致您描述的行爲。第一級緩存不會導致這種行爲,無論如何,我認爲你不能禁用它。

要禁用Hibernate二級緩存,請從Hibernate配置文件hibernate-cfg.xml中刪除引用二級緩存的所有行。例如:

<!-- Enable the second-level cache --> 
<property name="hibernate.cache.provider_class"> 
    net.sf.ehcache.hibernate.EhCacheProvider 
</property> 
<property name="hibernate.cache.region.factory_class"> 
    net.sf.ehcache.hibernate.EhCacheRegionFactory 
</property> 
<property name="hibernate.cache.use_query_cache">true</property> 
<property name="hibernate.cache.use_second_level_cache">true</property> 
<property name="hibernate.cache.use_structured_entries">true</property>  
<property name="hibernate.cache.generate_statistics">true</property> 
+0

嗨德里克,謝謝你的回覆!嗯,似乎我沒有二級緩存,也許試圖去除一級?我怎樣才能做到這一點? – gennad 2010-11-15 19:16:26

+0

據我所知,你不能禁用第一級緩存,但根據http://stackoverflow.com/questions/3943366/how-can-i-configure-hibernate-to-immediately-apply-all-saves -updates-and-delete/3946939#3946939,Spring可以啓用第一級緩存的急切刷新,這將有效地實現相同的結果。 – 2010-11-16 05:41:52

-1

可以使用 hints.put( 「javax.persistence.cache.retrieveMode」,CacheRetrieveMode.BYPASS); ()它可能工作。

1

爲了「嘗試」禁用第一級緩存,每次請求EntityManager時都會將其逐出。爲我工作;)

public EntityManager getEntityManager(){ 
     if(emf == null){ 
      if (parameters == null) { 
       emf = Persistence.createEntityManagerFactory(persistenceUnitName); 
      } else { 
       emf = Persistence.createEntityManagerFactory(persistenceUnitName, parameters); 
      } 
     } else { 
      emf.getCache().evictAll(); 
     } 

     EntityManager em = emf.createEntityManager(); 
     return em; 
    } 
+1

謝謝,這對我有用。 – CrushedPixel 2016-07-19 11:35:18