如果要使用缓存, 必须在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="user")
- @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
同样,由于查询缓存的作用,该查询也只执行一次