ssh整合之Session延迟加载问题的解决

问题描述:在使用Hibernate和Struts是经常会遇到如下BUG:

org.apache.struts2.json.JSONException: org.apache.struts2.json.JSONException: org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: blank.domain.Route.stopRoutes, could not initialize proxy - no Session

解决方案:

方法一、在web.xml中添加Session过滤器的配置

  <!-- 延迟关闭session 的顺序位于struts2过滤之上 否则延迟关闭session不起作用 -->
     <filter>  
         <filter-name>opensession</filter-name>  
          <filter-class>  
            org.springframework.orm.hibernate4.support.OpenSessionInViewFilter  
          </filter-class>  
           <init-param>    
               <param-name>flushMode</param-name>    
              <param-value>AUTO</param-value>    
         </init-param>   
          <init-param>    
               <param-name>singleSession</param-name>    
              <param-value>true</param-value>    
          </init-param>    
      </filter>  
      <filter-mapping>  
         <filter-name>opensession</filter-name>  
         <url-pattern>/*</url-pattern>  
     </filter-mapping>

由于org.springframework.orm.hibernate4.support.OpenSessionInViewFilter这个类中指定sessionFactoryBeanName的值为“sessionFactory”

所以,在Spring配置文件中,与SessionFactory相关的配置需要把名称改为“sessionFactory”,否则会报找不到sessionFactory的BUG。

具体如下:

  <!-- SessionFactory工厂 -->
    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="configLocation">
            <value>classpath:hibernate.cfg.xml</value>
        </property>
    </bean>

<!-- 配置HibernateTemplate模板 -->
    <bean id="hibernateTemplate" class="org.springframework.orm.hibernate4.HibernateTemplate">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>

<!-- 配置HibernateDaoSupport -->
    <bean id="hibernateDaoSupport"
        class="org.springframework.orm.hibernate4.support.HibernateDaoSupport"
        abstract="true">
        <property name="hibernateTemplate" ref="hibernateTemplate" />
    </bean>

<!-- Hinernate的事务管理器 -->
    <bean id="hibernateTransactionManager"
        class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>

方法二、在Hibernate的*.hbm.xml配置文件中将lazy属性设置为false(不推荐)。

案例:

  stopRoute.hbm.xml中

  <many-to-one name="route" class="Route" cascade="save-update" fetch="join" lazy="false">
            <column name="rid" />
        </many-to-one>
        <many-to-one name="stop" class="Stop" cascade="save-update" fetch="join" lazy="false">
            <column name="sid" />
        </many-to-one>

  Route.hbm.xml中

  <set name="stopRoutes" inverse="true" cascade="delete" lazy="false">
            <key>
                <column name="rid" />
            </key>
            <one-to-many class="StopRoute" />
        </set>

时间: 2024-10-18 14:15:13

ssh整合之Session延迟加载问题的解决的相关文章

用ssh整合时,用sessionfactory的getCurrentSession()获取不到session

在用ssh整合时,一开始用的是getCurrentSession(),获取当前线程上的session,但是总是抛异常,不能获取. 后来用sessionfactory的openSession(),但是,会发现一旦程序多次运行就会报错,提示没得session可获取. 那么怎么解决呢. 在beans.xml里面的hibernateProperties配置hibernate.current_session_context_class=org.springframework.orm.hibernate3.

ssh整合常见的后台错误

ssh整合以及常见的后台错误 摘自网络 jsp和Servlet之间传值出现乱码的解决方案 采用设置字符集的方式 request.setCharacterEncoding("utf-8"); 在web.xml文件里定义编码,同时在CoreFilter类里定义编码为utf-8 <filter> <filter-name>encodingFilter</filter-name> <filter-class>fengke.filter.CoreF

SSH整合总结(xml与注解)

本人自己进行的SSH整合,中间遇到不少问题,特此做些总结,仅供参考. 一.使用XML配置: SSH版本 Struts-2.3.31 Spring-4.3.5 Hibernate-4.2.21 引入jar包 必须在WEB-INF下添加jar包(其他无效) spring以及它的依赖包 com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar hibernate的jar包及struts2的jar和插件包,包含两个重复的javassist.jar,保留高

框架 day37 Spring事务管理,整合web,SSH整合,SSH整合注解

1     事务管理 1.1   回顾事务     事务:一组业务操作,要么全部成功,要么全部不成功.     事务特性:ACID 原子性:整体 一致性:数据(完整) 隔离性:并发(多个事务) 持久性:结果     隔离问题:脏读.不可重复读.幻读(虚读)     隔离级别:4个 readuncommitted 读未提交,存在3个问题. readcommitted 读已提交,解决:脏读:存在2个. repeatableread 可重复读,解决:脏读.不可重复读:存在1个 serializ

SSH整合简单例子

说明:简单SSH整合,struts版本2.3.32,spring版本3.2.9,hibernate版本3.6.10 一.开发步骤 1 引jar包,创建用户library.使用的包和之前博文相同,可以参考spring和hibernate整合,事务管理,struts和spring整合 jar包如下 //struts_core Struts2.3.32core\commons-fileupload-1.3.2.jar Struts2.3.32core\commons-io-2.2.jar Struts

spring的使用-ssh整合

ssh整合-xml方式: 1.需要记住的三个jar包: spring-web-4.2.4.RELEASE.jar           ---保证项目启动时就实例化spring配置的对象(通过一个servletContext监听器ContextLoaderListener实现),保证整个项目只有一个工厂. struts2-spring-plugin-2.3.24.jar ---解决了struts2和spring的整合问题,将struts2中的action交给spring创建 spring-orm-

SSH整合基础

1.Spring整合Hibernate 整合步骤 导包 配置appliactionContext.xml 创建实体类和映射关系文件 创建DAO接口及实现类 声明DAO组件,注入SessionFactory 2.Spring整合Struts2 导包 配置web.xml 配置applicationContext.xml,开启注解扫描 创建并声明Action 配置Action 创建JSP 3.整合的基本原理 Struts原本使用StrutsObjectFactory来读取struts.xml,根据ac

Spring(八)SSH整合简述

一.Spring与Struts2的整合 1.1.整合步骤 1.2.配置web.xml 1.3.配置spring配置文件applicationContext.xml 1.4.配置struts配置文件 1.5.Action继承ActionSupport类 二.spring与hibernate整合 2.1.步骤 2.2.注入sessionFactory <--数据源--> <bean id="dataSource" class="org.springframewo

SSH Secure Shell Client中文乱码的解决方法

这是SSH Secure Shell Client多年未解决的短板,要求客户端和服务器端都要'UTF-8'编码,Windows中文版的编码是非UTF-8.zh_CN.UTF-8是UTF编码的中文语言环境.Windows使用的是GB2312编码,大多数linux系统支持的是UTF-8编码,而远程登陆时使用的是本地编码,所以会出现乱码的问题:现有几种解决方案: 方案一:修改linux服务器的环境变量 使用linux,在用户根目录下有一个.bash_profile配置文件,该配置只对当前用户有效.若对