由于查询缓存,依赖二级缓存,所以先必须开启二级缓存!!
步骤如下:
首先,通过配置文件开启查询缓存
情况一,项目有hibernate.cfg.xml文件
通过修改hibernate.cfg.xml文件,开启查询缓存功能
<!-- 开启二级缓存,使用EhCache缓存 -->
<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
<!-- 开启查询缓存 -->
<property name="hibernate.cache.use_query_cache">true</property>
情况二,项目集成了Spring框架,没有hibernate.cfg.xml文件
通过修改applicationContext.xml文件,开启查询缓存功能
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
......
<property name="hibernateProperties">
<props>
......
<!-- 开启二级缓存,使用EhCache缓存 -->
<prop key="hibernate.cache.use_second_level_cache">true</prop>
<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
<!-- 开启查询缓存 -->
<prop key="hibernate.cache.use_query_cache">true</prop>
......
</props>
</property>
<property name="mappingResources">
<list>
<value>edu/po/Users.hbm.xml</value>
<value>edu/po/TLog.hbm.xml</value>
</list>
</property>
</bean>
接着,通过Query.setCacheable(true) 或 HibernateTemplate.setCacheQueries(true)使用查询缓存功能
要使用查询缓存,就必须在二级缓存中存在该实体类的缓存对象,二级缓存的配置见博客Hibernate二级缓存,使用Ehache缓存框架
例子,如下
Session session3 = sessionFactory.openSession();
session3.beginTransaction();
Query query = session3.createQuery("from Users where id = :id");
query.setParameter("id", 6);
query.setCacheable(true); //启用查询缓存
Users user3 = (Users)query.list().get(0);
System.out.println("用户名:" + user3.getUsername());
session3.getTransaction().commit();
session3.close();
HibernateTemplate hibernateTemplate = new HibernateTemplate(sessionFactory);
hibernateTemplate.setCacheQueries(true); //开启查询缓存
Users user9 = (Users)hibernateTemplate.find("from Users where id = ?",6).get(0);
System.out.println("用户名:" + user9.getUsername());
项目demo: https://github.com/zengyh/SSHWebProject.git