org.hibernate.LazyInitializationException: could not initialize proxy - no Session
病症:这是一个lazy使用后的Exception,使用迟时加载,在session(hibernate里的session),关闭后使用该对象的未加载变量,也就是说session已经关闭,没有保存到内存中,然后你使用了,导致该异常
1 解决方案一
在相应的配置文件中设置 lazy=‘false’ lazy顾名思义是“懒” ,就是当加载当前对象的时候是否加载与之关联的对象,当 lazy=‘false’ 时候 是加载, 默认是lazy=‘true’ 不加载 当你需要的时候在发起sql请求
不过这方法的弊端在于 ,会把所有与之相关的数据多加载进来会造成内存浪费
2 或者使用 fetch="join" 默认是抓取内连接, 他就是强制在加载对象的时候一次加载与之关联的内容放到缓存区 中,当再次取得时候不会在发起sql请求 ,不管你连接是否关闭一样可以取出来; 它的原理: 就是采用连接方法将相关联的对象一次加载,覆盖其设置的 lazy 属性
Hibernate:
select
this_.ID as ID0_1_,
this_.S_ID as S2_0_1_,
this_.S_CJ as S3_0_1_,
students2_.ID as ID1_0_,
students2_.NAME as NAME1_0_,
students2_.AGE as AGE1_0_
from
SOCCOT this_ left outer join STUDENTS students2_
on this_.S_ID=students2_.ID
-------------------------------------
org.pojo.Students@6835fb
3 web.xml 文件中 设置过滤器针对每次请求,延迟关闭session时间,只有当服务器将信息返回给用户时连接才关闭,
<!-- 处理session 关闭问题 -->
<filter>
<filter-name>opensession</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>opensession</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
我只知道这几种方式 嘿嘿