一直很苦恼怎么比较有效解决hibernate的lazy问题..假如有个User和Clazz的Entity 当我用hibernate获取到Clazz的时候View的这一部分会拿Clazz里面所有的属性,里面包括User,跟着就会给我报lazy这个异常出来。但我并不需要获取User这个属性...怎么解决这个问题..不要跟我说用opensessioninview,我觉得这个是一个很糟糕的做法.. 求各路英雄搭救啊。。spring mvchibernatelazy

解决方案 »

  1.   

    是你在离开 service 层去往view层的时候,session被你手动的关闭掉了。
    但是你的clazz.hibernate.xml配置文件中,User映射的配置是 延迟加载(懒加载),
    所以你在获取clazz的时候并没有加载user这个属性。然而你在view那个层绝对间接或直接的调用了user这个属性,这时候session已经关闭,由于clazz是一个hibernte的代理对象,所以在调用其属性时候,会先判断与数据库的session绑定(与数据库是否有会话),然而session被你关闭,所以通向数据库的链接被你关闭,你就无法取到数据库中user这个属性了,就出现了懒加载异常,实际上是因为没有与数据库获得会话,导致懒加载未能实现。建议在clazz.hibernate.xml中把user这个属性强制加载,如果用不到user这个属性,那么在view层避免调用。
    如果需要user,又不想用opensessioninview 那就在service层把所有要求的数据获得,封装成VO,在view层调用VO,不过比较麻烦。建议你百度 hibernate的session关闭有哪几种方式
      

  2.   

    这个不好弄,我都是像你说的用opensessioninview ,或直接禁用lazy加载至今我也没发现好的办法
      

  3.   

    hibernate一直没有用。opensessiononinview是可以解决的,目前还不知道有什么其它好点的办法。
      

  4.   

    建议你百度 hibernate的session关闭有哪几种方式
      

  5.   

    怎么避免在view层调用user这个属性呢?
      

  6.   

    真没纠结过其它方法。
    要么eager要么opensessioninview 
      

  7.   

    直接强制抓取,在hql语句中用fetch关键字
      

  8.   

    先把你觉得没有必要的属性设置lazy=true,你以后要用到它在fetch他
    比如说
    User
         int id
         List<Book> books
    你把books这个设置懒加载
    要用到它时hql:from User u left outer join fetch u.books这就可以了
    如果要把结果序列化成json格式的话,在service层把u.setBooks(null)不是要报懒加载异常的
      

  9.   

    设置为null是可以啦 这算是避免在view层调用book这个属性吗?
      

  10.   

    当你查询出来Clazz对象以后  手动调用一次getUsers()
    如果非要默认不懒  用fetch
      

  11.   

    设置为null是可以啦 这算是避免在view层调用book这个属性吗?
    设置为空是为了序列话json格式暴异常,如果你要在view层调用books这个属性只有现在dao层fetch他。不然要出错的
      

  12.   

    有几种方法(都不用把lazy设置为false)
    (1)Hibernate.initialize(XX.getYYYY());强制加载,哪个属性要拿到session外面就强制加载哪个
    (2)join fetch 出现fetch自动屏蔽lazy,建议第一种
      

  13.   

    貌似在session close之后就不能用Hibernate.initialize()了 不然就会报错
    报的错是org.hibernate.HibernateException: collection is not associated with any session
    但你这种办法可以避免fetch..但这样就产生多条select语句 为什么还要建议用它呢
      

  14.   

    hibernate产生多余的SQL是没办法的,所以为什么访问量高的系统,不选择hibernate,就是SQL不灵活,毕竟生成的SQL比不上人手写SQL
      

  15.   

    为什么不让用opensessioninview,要不你就不要用lazy,直接抓取!