大家好:
    小菜我最近有一个JSP项目,使用SSH框架,需要用到 Hibernate 的延迟加载功能,可不管如何设置,都会在控制台输出org.hibernate.LazyInitializationException: could not initialize proxy - no Session异常。    我在网上找了很多解决办法,除了禁用延迟加载外,其他的方法在我这里都不管用,是在搞不懂为什么。    网上说的什么添加 OpenSessionInViewFilter,什么 OpenSessionInViewInterceptor、ContextLoaderListener、ContextLoaderServlet 都试过了,依旧的no Session......    小弟已经无奈了,为了不影响项目进度,只能暂时禁用 lazy 来解决问题,可后期项目会经常从数据库读取大量的数据,如果不启用 lazy ,我怕后期项目没办法做了(性能太差,没办法交付了)。    目前使用的是 Struts1.3 + Spring 3.0 + Hibernate 3.3 + JDK1.6。开发平台是 MyEclipse 8.5 蓝版。另外,换成Struts1.3 + Spring 2.5 + Hibernate 3.0问题照旧。    时间不早了,就不在线等了。期待着最终的解决方案,在此先谢谢每位浏览、回复的朋友了,谢谢~~~

解决方案 »

  1.   


      小弟已经无奈了,为了不影响项目进度,只能暂时禁用 lazy 来解决问题,可后期项目会经常从数据库读取大量的数据,如果不启用 lazy ,我怕后期项目没办法做了(性能太差,没办法交付了)。
    其实将对象与对象之间关联我的主要目的是便于更新 绝对不是为了查询。。 如果一定要将本身以及关联全部查询出来你完全可以用join语句嘛 ... 你开启lazy 效率反倒会更差
      

  2.   

    http://topic.csdn.net/u/20100526/10/864ac9b1-5e30-4781-a8b9-668f32637edf.html?83847
      

  3.   

    如果数据量小,禁用lazy 使用 join 没问题,但是,我的项目是由多个小项目组成的,一个主表可能会跟N多个表存在主外键关系(比如用户信息表)。不能简简单单的设置join,这样的话有可能一涉及到用户信息,就会搜索出大量的与当前功能无关的数据,占用系统资源。纵不能把这些东西放到cache中去吧?lazy很符合我这个项目的需求,需要时就能够直接查出来,不需要时,不会占用系统资源。
      

  4.   

    非常感谢三楼提供的连接,但是Filter已经用过了,还是没有解决问题
      

  5.   

    出现这个问题的原因在于
    你在Session1中加载了一个对象A,里面包含有一个延时加载的Collection或者对象 B
    无论用手工还是OpenSessionInViewFilter好,最后都关闭了Session1而你代码中持有这个对象A,在另外一次请求中你访问A.getB()等延时加载的对象,这时Hibernate就一定会报no Session或者Session Closed等异常为避免这个异常,你可以在访问getB的时候重新加载一次A,这样就不会出现此问题
    又或者在Session1还没有关闭之前调用A.getB().getName()(随便一个非主键属性),这样B就会初始化好了。即使Session1关闭了也不会有异常。
      

  6.   

    我大致明白 ChDw  的意思,这样做适用于many to one 映射关系,不适合 one to many 关系。那如果要查询出跟实体有关的集合(比如由该用户发布的所有帖子)是不是只能通过调用特定实体的DAO泪来完成,而不能通过实体的 Set 集合属性获得了呢?
      

  7.   

    一样的啊。如果是关于A.getCList()这样的延时加载List,
    那么你可以重新加载A来获得A.getCList(),又或者在关闭Session1之前调用A.getCList().size()就初始化好CList里面的属性。但是CList中的C对象中的延时加载还是需要在Session1关闭前初始化或者重新加载C来获得
      

  8.   

    非常感谢 ChDw 的回答,你的方法确实不错,但这好像只能在数据访问层来完成。我现在使用的方法是,多对一跟一对一全部禁用lazy,一对多则启用lazy,但直接调用getList 获得Set集合,而是调用对应实体的DAO类,利用 HQL 获得,然后再 调用setList方法添加到实体中。不过这样一来,一对多的映射关系貌似没用了结贴了,因为 ChDw 确实可以解决问题,所以,分数全部发给 ChDw 了。