查询缓存查找实体对象:
session.beginTransaction();
/**
* 如果查询的是实体对象,在查询缓存中缓存的是实体对象的ID列表,而实体对象本身被放到了二级缓存中,所以查询缓存需要配合二级缓存一起使用。
* 假如二级缓存没有启用,将导致即使是list操作也会发出n条查询语句去查询实体对象! */
String hql = "select p from Person p";
List persons = session.createQuery(hql)
.setCacheable(true) //允许查询缓存!
.list();
for (Iterator iterator = persons.iterator(); iterator.hasNext();) {
Person cp = (Person) iterator.next();
System.out.println(cp.getId()+","+cp.getName());
}
session.getTransaction().commit();
}catch(Exception e){
e.printStackTrace();
session.getTransaction().rollback();
}finally{
//session关闭之后,当前session对象中的一级缓存已经被清空
session.close();
}
Session session2 = HibernateUtil.openSession();
try{
session2.beginTransaction();
String hql = "select p from Person p";
List persons = session2.createQuery(hql)
.setCacheable(true) //允许查询缓存!
.list();
for (Iterator iterator = persons.iterator(); iterator.hasNext();) {
Person cp = (Person) iterator.next();
System.out.println(cp.getId()+","+cp.getName());
}
session2.getTransaction().commit();