如果要使用缓存, 必须在persistence.xml文件中设定
<property name="hibernate.cache.provider_class" value="org.hibernate.cache.EhCacheProvider"/> <property name="hibernate.cache.use_second_level_cache" value="true"/> <property name="hibernate.cache.use_query_cache" value="true"/>
然后 Entity 需要
@Entity@Table(name="users")@Cache(usage=CacheConcurrencyStrategy.READ_ONLY)public class User {
@Cache(usage=CacheConcurrencyStrategy.READ_ONLY)
表示该Entity加入到CacheManager的管理下
em = emf.createEntityManager(); em.find(User.class, 1); em.find(User.class, 1); em.close(); System.out.println("----xxx----"); em = emf.createEntityManager(); em.find(User.class, 1); Query query = em.createQuery("from User"); if(query instanceof org.hibernate.ejb.QueryImpl<?>){ ((QueryImpl<?>) query).getHibernateQuery().setCacheable(true); } query.getResultList(); query.getResultList();
要使用查询缓存:主要设置
if(query instanceof org.hibernate.ejb.QueryImpl<?>){
((QueryImpl<?>) query).getHibernateQuery().setCacheable(true);
}
运行结果
=============
Hibernate: select user0_.id ...... from users user0_ where user0_.id=?
----xxx----
Hibernate: select user0_.id ...... from users user0_
===============
em.find
em.find
em.find
多个 em 在二级缓存中均有效,所以只执行一次
-----xxxxx-----
query.getResultList
query.getResultList
同样,由于查询缓存的作用,该查询也只执行一次