Hibernate二级缓存和查询缓存的简单测试

利用二级缓存和查询缓存结合缓存一些属性,通过query.list()方法返回属性列表。

首先在hibernate.cfg.xml开启二级缓存和查询缓存:

<?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!--数据库连接信息略--> <property name="show_sql">true</property> <property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property> <!-- 启用查询缓存 --> <property name="cache.use_query_cache">true</property> <!-- 启用二级缓存 --> <property name="cache.use_second_level_cache">true</property> <mapping resource="com/kin/entity/ErmEmployee.hbm.xml" /> <mapping resource="com/kin/entity/SysDepartment.hbm.xml" /> </session-factory> </hibernate-configuration>

SysDepartment.java类:

package com.kin.entity; import java.util.Date; import java.util.HashSet; import java.util.Set; public class SysDepartment implements Comparable, java.io.Serializable { private Integer dptId; private String dptName; private Set ermEmployees = new HashSet(0); //getter,setter方法略 //重写compare方法 public int compareTo(Object obj) { if (obj instanceof SysDepartment) { SysDepartment sysDepartment = (SysDepartment) obj; if (sequence > sysDepartment.getSequence()) { return 1; }else if (sequence < sysDepartment.getSequence()) { return -1; }else { return 0; } }else { throw new ClassCastException("对象类型不一样,不能进行比较"); } } @Override public boolean equals(Object obj) { return this.getDptId().equals(((SysDepartment)obj).getDptId()); } }

SysDepartment.hbm.xml

<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Mapping file autogenerated by MyEclipse Persistence Tools --> <hibernate-mapping package="com.kin.entity"> <class name="SysDepartment" table="SYS_Department" schema="dbo" catalog="doss" lazy="false"> <!--启用二级缓存--> <cache usage="read-write"/> <id name="dptId" type="java.lang.Integer"> <column name="DPT_ID" /> <generator class="identity" /> </id> <property name="parentId" type="java.lang.Integer"> <column name="ParentID" /> </property> <property name="dptName" type="java.lang.String"> <column name="DPT_Name" length="50" /> </property> <set name="ermEmployees" inverse="true"> <key> <column name="DPT_ID" /> </key> <one-to-many class="com.kin.entity.ErmEmployee" /> </set> </class> </hibernate-mapping>

ErmEmployee.java

package com.kin.entity; public class ErmEmployee{ private Integer eplId; private SysDepartment sysDepartment; private String eplName; public ErmEmployee() { } // getter,setter方法略 }

ErmEmployee.hbm.xml

<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Mapping file autogenerated by MyEclipse Persistence Tools --> <hibernate-mapping package="com.kin.entity"> <class name="ErmEmployee" table="ERM_Employee" schema="dbo" catalog="doss" lazy="false"> <!-- 启用二级缓存 缓存策略为read-write--> <cache usage="read-write"/> <id name="eplId" type="java.lang.Integer"> <column name="EPL_ID" /> <generator class="identity" /> </id> <many-to-one name="sysDepartment" class="com.kin.entity.SysDepartment" fetch="select"> <column name="DPT_ID" /> </many-to-one> <property name="eplName" type="java.lang.String"> <column name="EPL_Name" length="20" /> </property> </class> </hibernate-mapping>

测试用例:

package com.kin.entity; import java.util.Iterator; import java.util.List; import org.hibernate.HibernateException; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; public class CacheTest { //开启了二级缓存和查询缓存。用query.list()查询实体 @org.junit.Test public void testCache_query_list() { Configuration cfg = new Configuration().configure(); SessionFactory sessionFactory = cfg.buildSessionFactory(); Session session = null; //第一个session try { session = sessionFactory.openSession(); session.beginTransaction(); Query query = session.createQuery("from SysDepartment d "); query.setCacheable(true); List<SysDepartment> dList = query.list();//会发出查询所有SysDepartment实例的sql List<Object[]> eplList = null; String getEplSQL = "select e.eplId,e.eplName from ErmEmployee e where e.sysDepartment.dptId = ? and e.esId in(1801,1802)"; for (SysDepartment sysDepartment : dList) { System.out.println(sysDepartment.getDptId() + ":" + sysDepartment.getDptName()); query=session.createQuery(getEplSQL); query.setCacheable(true); query.setParameter(0, sysDepartment.getDptId()); eplList = query.list();//会发出根据SysDepartment的id查询所有的ErmEmployee实例的sql语句 for (Object[] e : eplList) { System.out.println(e[0] + ":" + e[1]); } } session.getTransaction().commit(); } catch (HibernateException e) { session.getTransaction().rollback(); e.printStackTrace(); } finally { session.close(); } System.out.println("----------------------------------------------------"); //开启另一session try { session = sessionFactory.openSession(); session.beginTransaction(); Query query = session.createQuery("from SysDepartment d "); query.setCacheable(true); List<SysDepartment> dList = query.list();//不会发出查询所有SysDepartment实例的sql List<Object[]> eplList = null; String getEplSQL = "select e.eplId,e.eplName from ErmEmployee e where e.sysDepartment.dptId = ? and e.esId in(1801,1802)"; for (SysDepartment sysDepartment : dList) { System.out.println(sysDepartment.getDptId() + ":" + sysDepartment.getDptName()); query=session.createQuery(getEplSQL); query.setCacheable(true); query.setParameter(0, sysDepartment.getDptId()); eplList = query.list();//不会发sql语句 for (Object[] e : eplList) { System.out.println(e[0] + ":" + e[1]); } } session.getTransaction().commit(); } catch (HibernateException e) { session.getTransaction().rollback(); e.printStackTrace(); } finally { session.close(); } } }

当String getEplSQL = "select e.eplId,e.eplName from ErmEmployee e where e.sysDepartment.dptId = ? and e.esId in(1801,1802)";

改为String getEplSQL = "select e.eplId,e.eplName from ErmEmployee e where e.sysDepartment = ? and e.esId in(1801,1802)";

之时,第二次session中,执行eplList = query.list();查询,则还是会发出sql,这是因为sysDepartment对象不同,所以还是会执行查询

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值