大家好:
小菜我最近有一个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问题照旧。 时间不早了,就不在线等了。期待着最终的解决方案,在此先谢谢每位浏览、回复的朋友了,谢谢~~~
小菜我最近有一个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问题照旧。 时间不早了,就不在线等了。期待着最终的解决方案,在此先谢谢每位浏览、回复的朋友了,谢谢~~~
小弟已经无奈了,为了不影响项目进度,只能暂时禁用 lazy 来解决问题,可后期项目会经常从数据库读取大量的数据,如果不启用 lazy ,我怕后期项目没办法做了(性能太差,没办法交付了)。
其实将对象与对象之间关联我的主要目的是便于更新 绝对不是为了查询。。 如果一定要将本身以及关联全部查询出来你完全可以用join语句嘛 ... 你开启lazy 效率反倒会更差
你在Session1中加载了一个对象A,里面包含有一个延时加载的Collection或者对象 B
无论用手工还是OpenSessionInViewFilter好,最后都关闭了Session1而你代码中持有这个对象A,在另外一次请求中你访问A.getB()等延时加载的对象,这时Hibernate就一定会报no Session或者Session Closed等异常为避免这个异常,你可以在访问getB的时候重新加载一次A,这样就不会出现此问题
又或者在Session1还没有关闭之前调用A.getB().getName()(随便一个非主键属性),这样B就会初始化好了。即使Session1关闭了也不会有异常。
那么你可以重新加载A来获得A.getCList(),又或者在关闭Session1之前调用A.getCList().size()就初始化好CList里面的属性。但是CList中的C对象中的延时加载还是需要在Session1关闭前初始化或者重新加载C来获得