hibernate学习笔记-关闭session以后如何进行懒加载《二》

当在使用Hibernate作开发的时候出现org.hibernate.LazyInitializationException: could not initialize proxy - no Sessionweb

错误提示session

病症:这是一个lazy使用后的Exception,使用迟时加载,在session(hibernate里的session)关闭后使用该对象的未加载变量,也就是说session已经关闭,没有保存到内存中,而后你使用了,致使该异常。
解决方法:spa

方法1:hibernate

<may-to-one>or<one-to-may>的lazy属性默认为:lazy = "proxy"
解决:<many-to-one>   & <set> 中设置 lazy="false"线程

若是还不行,根据本身需求,通过个人仔细排查放在set一端不行,那就放在<many-to-one>那端orm

 

总结:缘由是hibernate的session已经关闭,集合没有被初始化。在hibernate中:hibernate3 默认支持延迟加载(lazy="proxy"咱们能够把proxy看做是true),hibernate2 默认当即加载 (lazy="false")。xml

      在hibernate3中,全部的实体设置文件(user.hbm.xml)中的lazy属性都被默认设成了true,就是当这个类没有被调用时,延时加载,致使了以上状况的发生,在配置文件中将lzay属性设为false就能够了。对象

 

可是这种方法非常消耗资源事务


方法2:用openSessionInView内存

 

Spring为咱们解决最让人头痛的难题之一,Hibernate的Session的关闭与开启问题。 
Hibernate 容许对关联对象、属性进行延迟加载,可是必须保证延迟加载的操做限于同一个 Hibernate Session 范围以内进行。若是 Service 层返回一个启用了延迟加载功能的领域对象给 Web 层,当 Web 层访问到那些须要延迟加载的数据时,因为加载领域对象的 Hibernate Session 已经关闭,这些致使延迟加载数据的访问异常。而Spring为咱们提供的OpenSessionInViewFilter过滤器为咱们很好的解决了这个问题。OpenSessionInViewFilter的主要功能是使每一个请求过程绑定一个 Hibernate Session,即便最初的事务已经完成了,也能够在 Web 层进行延迟加载的操做。OpenSessionInViewFilter 过滤器将 Hibernate Session 绑定到请求线程中,它将自动被 Spring 的事务管理器探测到。因此 OpenSessionInViewFilter 适用于 Service 层使用HibernateTransactionManager 或 JtaTransactionManager 进行事务管理的环境,也能够用于非事务只读的数据操做中。

所谓的OpenSessionInView模式,把session的周期交给servlet filter来管理,每当有request进来,就打开一个sessionresponse结束以后再关闭它,这样可让session存在于整个请求周期中

相关文章
相关标签/搜索