zoukankan      html  css  js  c++  java
  • Hibernate 懒加载 错误----no session

    错误: unable to evaluate the expression Method threw 'org.hibernate.LazyInitializa

       org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: XXXX, could not initialize proxy - no Session
    原因:Hibernate延迟加载策略, 也就是用到的时候才去加载.这样可以提高一些性能.
    Hibernate的lazy loading 采用了一个HibernateSession来管理session,它的逻辑是每进行一次数据库操作,就开新的session,操作完成后立即关闭该session。这样做的好处是可以严格关闭session,避免菜鸟级的错误,但是并不推荐这么做。因为这不适合lazy loading,也不适合跨方法的事务。

      比如在我们的应用中,user->post形成一对多的映射,User中有一个包含post的List。
    在User中,有多个属性:name,password,phone等,还有一个List类型的posts。当我们对posts使用lazy laoding的时候,hibernate会在获得User对象的时候,仅仅返回name,password,phone等基本属性,当你访问posts的时候,它才会从数据库中提取posts需要的数据,这就是所谓lazy laoding。但是在我们的系统中,session是被立即关闭的,也就是在读取了name,password,phone等基本属性后,session已经close了,再进行lazy loaiding就会有异常。

    解决办法:使用OpenSessionInViewInterceptor拦截器

      1.在springmvc 配置文件中添加拦截器配置

        <mvc:interceptors>
            <bean class="org.springframework.orm.hibernate4.support.OpenSessionInViewInterceptor">
                 <property name="sessionFactory" ref="sessionFactory"/>
            </bean>
        </mvc:interceptors>

      2.或者在web.xml中配置filter

      

      

  • 相关阅读:
    sqlserver备份后无法还原的解决方法
    Silverlight如何与JS相互调用
    【转】体验 Silverlight 5 3D开发之环境搭配篇
    C#实现邮箱搬家功能(1):Pop3协议介绍
    【转】针对大数据量表的优化查询
    Centos7Docker安装Redis
    Centos7.*Consul安装配置
    Centos7Docker安装nacos
    Centos7Docker安装neo4j
    Spring框架根据传入参数动态的修改注解属性的值
  • 原文地址:https://www.cnblogs.com/nww57/p/5016976.html
Copyright © 2011-2022 走看看