Java Hibernate4和二级缓存:我的理解有什么错?

Java Hibernate4和二级缓存:我的理解有什么错?,java,hibernate,second-level-cache,Java,Hibernate,Second Level Cache,我已经开始使用Hibernate4和二级缓存。 根据文档,配置非常简单: <property name="hibernate.cache.use_second_level_cache" value="true"></property> <property name="hibernate.cache.use_query_cache" value="true"></property> <property name="hibernate.cac

我已经开始使用Hibernate4和二级缓存。 根据文档,配置非常简单:

<property name="hibernate.cache.use_second_level_cache"  value="true"></property>
<property name="hibernate.cache.use_query_cache"  value="true"></property>
<property name="hibernate.cache.region.factory_class"  value="org.hibernate.cache.ehcache.EhCacheRegionFactory"></property>
我运行了4次命名查询,不幸的是我看到hibernate运行了4次

EntityManagerFactory emf = Persistence.createEntityManagerFactory("test");      
EntityManager em = emf.createEntityManager();

Query query = em.createNamedQuery(SimplePerson.FIND_BY_NAME);
query.setParameter("name", "BOB");

List result = query.getResultList();
result = query.getResultList();
result = query.getResultList();
result = query.getResultList();
输出:

Hibernate: select simplepers0_.id as id0_, simplepers0_.name as name0_ from SimplePerson simplepers0_ where simplepers0_.name=?
Hibernate: select simplepers0_.id as id0_, simplepers0_.name as name0_ from SimplePerson simplepers0_ where simplepers0_.name=?
Hibernate: select simplepers0_.id as id0_, simplepers0_.name as name0_ from SimplePerson simplepers0_ where simplepers0_.name=?
Hibernate: select simplepers0_.id as id0_, simplepers0_.name as name0_ from SimplePerson simplepers0_ where simplepers0_.name=?
我对二级缓存的理解有什么错? 为什么Hibernate会运行查询4次? 我是否错过了一些配置

提前感谢,,
Michael您的配置中不应该也包含以下内容:

<cache usage="read-write"/>

另外,我忘了您需要在命名查询上设置
cacheable=“true”
属性,或者
setCacheable(true)
同时运行查询本身


注意:不确定hibernate中的语法是什么,但在Nhibernate中,它的SetCacheable(true)

SetCacheable方法在javax.persistence.Query中不可用,因此您需要向命名查询添加缓存提示(或调用setHint):


说,使用查询缓存已经跳过了鲨鱼,如果你甚至会考虑它。现在有了更好的方法,比如Spring缓存抽象。

+1阅读一篇很棒的文章,并解释查询缓存。
<cache usage="read-write"/>
@NamedQueries({
@NamedQuery(
    name="SimplePerson.findByName", 
    query="select p from SimplePerson p where p.name = :name", 
    hints = { @QueryHint(name = "org.hibernate.cacheable", value = "true") })
})