Hibernate查询缓存中的1+N

查询缓存查找实体对象:

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();

你可能感兴趣的:(Hibernate)