当前位置: 代码迷 >> J2SE >> Hibernate Query借口的iterate方法 查询缓存的有关问题
  详细解决方案

Hibernate Query借口的iterate方法 查询缓存的有关问题

热度:101   发布时间:2016-04-24 02:10:20.0
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=? 此步骤可以利用一级缓存,前提是这个实体已经加载到内存中,如果内存中不存在则需要发起查询,反之不需要....这就是所谓的利用缓存..
  相关解决方案