2010-11-15 62 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