//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"有效并解决了,其余的两种配置都没用啊???求解啊??

解决方案 »

  1.   

    Iterator方式要用缓冲机制才不会出现n+1问题。如果没有缓冲机制,就要避开Iterator方式。List方式就是对jdbc的简单封装了。一次取出所有的数据。
    上面说的缓存机制应该是Java Cache System吧。你自己查查,忘记了。
      

  2.   

    join fetch使用的话,lazy失效,一次过把全部数据拿出来,等同于平时selct XX,XX,XX from XX b join XXX a on a.id=b.XXid,不会出现N+1
      

  3.   

    是不是对于list()方法,配置了fetch="join"也是没有作用的啊???对于Iterator只能用缓存的方式去解决??不能用fetch=“join”去解决啊???我知道fetch=‘join’是连表查询,我试了下,用get方法会实现左联查询,但用list方法和iterate方法都失效了,我就疑惑了??????