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=? 此步骤可以利用一级缓存,前提是这个实体已经加载到内存中,如果内存中不存在则需要发起查询,反之不需要....这就是所谓的利用缓存..