1.实体映射文件:
<class name="com.foodchina.product.entity.TblCatalog" table="tbl_catalog" schema="dbo" catalog="cofco_oil_trading">
<cache usage="read-write"/>
<id name="intCatalogID" type="java.lang.Integer">
<column name="intCatalogID" length="20" />
<generator class="native" />
</id>
<property name="nvcCatName" type="java.lang.String">
<column name="nvcCatName" length="50" />
</property>
<property name="nvcCatKey" type="java.lang.String">
<column name="nvcCatKey" length="50" />
</property>
<property name="intParentId" type="java.lang.Integer">
<column name="intParentId"/>
</property>
<property name="nvcDesc" type="java.lang.String">
<column name="nvcDesc" length="200"/>
</property>
<property name="tintIfFinal" type="java.lang.Boolean">
<column name="tintIfFinal"/>
</property>
<property name="dtUpdateTime" type="java.util.Date">
<column name="dtUpdateTime" length="16"/>
</property>
<!-- order-by="id asc" -->
<bag name="children" lazy="false" inverse="true">
<cache usage="read-write"/>
<key column="intParentId" />
<one-to-many class="com.foodchina.product.entity.TblCatalog"/>
</bag>
</class>
2.spring中的hibernate配置文件:
<!-- 二级缓存 -->
<prop key="hibernate.cache.use_second_level_cache">
true
</prop>
<prop key="hibernate.cache.provider_class">
org.hibernate.cache.OSCacheProvider
</prop>
<!--启用hql键缓存,在使用条件查询时有用, 在此例子中,如果不启用,那么第一次请求永远都会命中数据库,因为查找顶级节点是用hql语句查询的。而不是get方法-->
<prop key="hibernate.cache.use_query_cache">
true
</prop>
3.hql语句:
String hql = "from TblCatalog o where o.intParentId =0;
4.用hql list查询时,开启缓存:
super.getHibernateTemplate().setCacheQueries(true);//启用二级缓存。
List ret = super.getHibernateTemplate().find(hql);
super.getHibernateTemplate().setCacheQueries(false);//关闭查询缓存
就可以使用缓存了!
注意:手动改变对象中的某个集合,会使缓存失效!所以,在这个例子里我让lazy=false,虽然第一次会产生大量sql,但是之后就不会了。