日期:2014-05-18  浏览次数:20678 次

Hibernate的_iterate查询与N+1此查询问题??
                //1、懒加载引起的n+1
List<Wife> wifes = session.createQuery("from Wife").list();
for (Wife wife : wifes) {
System.out.println(wife.getHus().getName());
}

//2、iterate引起的n+1
Iterator<Wife> ii=session.createQuery("from Wife").iterate();
while(ii.hasNext()){
System.out.println(ii.next().getName());
}

//3、懒加载引起的n+1
List<Wife> wifes2 = session.createCriteria(Wife.class).list();
for (Wife wife : wifes2) {
System.out.println(wife.getHus().getName());
}
我这个Wife类是一对多的“多的一方”,现在有n+1的问题,怎么解决???
为什么在第三种方式的xml文件里配置fetch="join"有效并解决了,其余的两种配置都没用啊???求解啊??


------解决方案--------------------
Iterator方式要用缓冲机制才不会出现n+1问题。如果没有缓冲机制,就要避开Iterator方式。

List方式就是对jdbc的简单封装了。一次取出所有的数据。


上面说的缓存机制应该是Java Cache System吧。你自己查查,忘记了。
------解决方案--------------------
join fetch使用的话,lazy失效,一次过把全部数据拿出来,等同于平时selct XX,XX,XX from XX b join XXX a on a.id=b.XXid,不会出现N+1