SSH:hibernate懒加载导致的no Session

在hibernate中,我们经常会设置两个实体之间的关系为

<one-to-one>   <many-to-many> <one to many>

用来描述两张表之间的关系,如一个员工有多种职务,而一个职务由多个员工担任,我们在查询员工的时候,需要显示其职务.
而我们查询员工列表会这样查询:

hibernateTemplate.find("from User");

这样就可以查询到所有的员工的信息.
但是当我们在页面调用员工的职务属性的时候,就会发现抛出了一个异常

could not initialize proxy - no Session

为什么会出现这个问题呢?
这就要说到hibernate的懒加载机制了.
什么是懒加载
懒加载就是在你查询表的时候只会返回一个id,而不会返回其他信息,这样做是为了减轻数据库的压力,只有当你需要其他信息(就是当你调用了其他属性,如调用了getter方法),这时候hibernate才会再从数据库中加载其他属性,要不然除了id,其他属性都是null.

现在来想想为什么会抛出no session错误
当你查询员工的时候,由于员工与职务为多对多关系,所以查询得到的员工列表中,职务只有id属性,其他属性为null.当你在页面中调用员工的职务属性的时候,hibernate才会从数据库查询.
但是…由于hibernateTemplate是spring所管理的,spring会在你的方法结束之后,自动释放session资源,就是说当你在Dao层返回员工列表之后,session就被释放了.当页面调用了员工中的职务属性的时候,hibernate想去数据库查询,但是,由于session已经被关闭了,所以才会抛出no session错误

解决办法
在web,xml中配置,延迟session的关闭

<!--spring 过滤器,延迟session关闭-->
  <filter>
        <filter-name>openSession</filter-name>
        <filter-class>org.springframework.orm.hibernate5.support.OpenSessionInViewFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>openSession</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

值得注意的是这个过滤器一定要放在struts2核心过滤器之前

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值