JAVA面试时当被问到hibernate中的N+1问题时,应该如何回答?

解决方案 »

  1.   

         怎么解决n +1 问题? 
    1 )lazy=true, hibernate3开始已经默认是lazy=true了;lazy=true时不会立刻查询关联对象,只有当需要关联对象(访问其属性,非id字段)时才会发生查询动作。 
    2)二级缓存, 在对象更新,删除,添加相对于查询要少得多时, 二级缓存的应用将不怕n +1 问题,因为即使第一次查询很慢,之后直接缓存命中也是很快的。 
    不同解决方法,不同的思路,第二条却刚好又利用了n +1 。 3) 当然你也可以设定fetch=join 
      

  2.   

    是1+N问题:
    解决办法1.fetch=Lazy
    2.HQL(EJBQL)
      

  3.   

    http://spiritfrog.javaeye.com/blog/197505
      

  4.   

    使用延迟加载 : Lazy fetch
      

  5.   

    如:
    select c from Customer c join fetch c.custextend join fetch c.certificate
    这样就可以避免N+1次访问数据库的情况
      

  6.   

    1+N是hibernate里头很经典的问题,就想大概描述一下1+N是什么,然后再回答会引起什么影响,然后再说这个问题应该怎么解决就OK了吧
      

  7.   

    N+1是指在多对多或多对1的映射时候出现的这么一种情况,hibernate默认情况下,对于many的那一方它从数据库取值的方式是fetchType.eager即把关联的one那一方也取出来,而对一的那方则默认是fetchType.lazy只取自己这个表的值,这样的话对于many的那方有的时候就需要根据实际情况来设定fetchType的值否则就会出现效率为题,一般有三种情况来解决:1设定fetchType为lazy,这样就不会取出对应的那个表的信息,2注解@Bachsize(value=5)这样每次去取一的那方的话就只取5条记录出来。3在HQL语言中用join fetch这样采用表连接的方式取出值就不用发出多条sql语句单独的取另一张表的数据了
      

  8.   

    参考下,写的很清楚,选自孙卫琴的《精通Hibernate:Java对象持久化技术详解》
    http://blog.csdn.net/gl74gs48/archive/2010/09/24/5903166.aspx