日期:2014-05-20  浏览次数:20733 次

Hibernate Query借口的iterate方法 查询缓存的问题。
iterate()方法查询一级缓存吗?

在我机器上测试,怎么不查询一级缓存呢?
Java code

    @Test 
    public void testIterate() {
         Session s = sf.getCurrentSession();
         s.beginTransaction();
         
         Query q = s.createQuery("from Category");
         Iterator<Category> it  = q.iterate();

         while (it.hasNext()) {
             Category c = it.next();
             System.out.println(c.getId());
         }
         
         it = q.iterate();
         
         while (it.hasNext()) {
             Category c = it.next();
             System.out.println(c.getId());
         }
         s.getTransaction().commit();
    }





结果
Hibernate: 
  select
  category0_.id as col_0_0_ 
  from
  Category category0_
1
2
3
4
5
6
7
8
9
10
Hibernate: 
  select
  category0_.id as col_0_0_ 
  from
  Category category0_
1
2
3
4
5
6
7
8
9
10


为什么不查询一级缓存呢?

不是说list 和 iterate 方法有一个区别就是iterate查询缓存吗?



------解决方案--------------------
iterate分两个步骤加载数据
1.查询出所有符合数据的ID,此步骤无法利用缓存,所以就会出现你看靠的多次select id from category;
2.当你真正访问实体属性时执行select * from Category where id=? 此步骤可以利用一级缓存,前提是这个实体已经加载到内存中,如果内存中不存在则需要发起查询,反之不需要....这就是所谓的利用缓存..