2011-10-31
Caused by: org.hibernate.LazyInitializationException: could not initialize proxy - no Session
at org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:132)
at org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:174)
at org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:190)
at com.sinovatech.bms.adm.model.dto.TBmsUserDTO_$$_javassist_40.getUserLoginName(TBmsUserDTO_$$_javassist_40.java)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at javax.el.BeanELResolver.getValue(BeanELResolver.java:62)
... 50 more
原因:
在hibernate3的 many-to-one的默认选项是 lazy = "proxy"
session已经关闭了,设置延迟加载到真真读取数据时才读数据库,但是此时数据库连接已经关闭了
解决方案
1 <many-to-one> & <set> 中设置 lazy="false"
(设置lazy="false" 解决了大部分的延时加载问题
但是同事也降低了系统的性能 ) 【成功】
2 将many-to-one部分的fetch设置为"join" 【失败】
3 OpenSessionInViewFilter (用SESSION的关闭延迟到请求结束,大部份的WEB应用都用这个解决) 【未测试】