Spring+Hibernate 配置一对多关联,及session关闭问题处理

Hibernate一对多关联映射时,出现failed to lazily initialize a collection of role: XXXXXX, no session or session was closed异常的解决方案:
一、配置一对多映射关联
    <set name="quAn" order-by="AN_CODE asc" lazy="true">
         <key column="AN_QU_ID" />
         <one-to-many class="com.study.entity.StudyExamQuAn"/>
     </set>
   注:1.order-by 后面的是字段名称而不是属性名称;
         2.key 的column为字段名称;
         3.lazy设置为true时为懒加载。

二、配置过滤器来解决出现 no session or session was closed 异常问题
    解决方法: 在项目的web.xml文件中加入如下代码:
<!--Spring解决加载延迟数据时hibernate session关闭问题, Spring将hibernate session绑定到每个请求线程,这样Spring的事物管理器就可以监听到-->  
    <filter> 
        <filter-name>OpenSessionInViewFilter</filter-name>
        <filter-class>
        org.springframework.orm.hibernate3.support.OpenSessionInViewFilter 
       </filter-class> 
       <init-param> 
            <param-name>singleSession</param-name> 
            <param-value>true</param-value> 
        </init-param> 
    </filter>   
    <filter-mapping>
  <filter-name>OpenSessionInViewFilter</filter-name>
  <url-pattern>/v/*</url-pattern>
</filter-mapping>
注:会出现org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.NEVER) - turn your Session into FlushMode.AUTO or remove 'readOnly' marker from transaction definition异常,要配置事务处理,否则会导致session处于只读状态而不能做修改、删除的动作 。

三. 配置Spring事务管理,以下采用拦截器的方式配置事务
    在applicationContext.xml文件中加入如下代码:
    <!-- 定义事务管理器 -->
<bean id="transactionManager"
  class="org.springframework.orm.hibernate3.HibernateTransactionManager">
  <property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- 用拦截器方式 处理事务 -->
  <bean id="transactionInterceptor"
        class="org.springframework.transaction.interceptor.TransactionInterceptor">
        <property name="transactionManager" ref="transactionManager" />
        <!-- 配置事务属性 -->
        <property name="transactionAttributes">
            <props>
                <prop key="*">PROPAGATION_REQUIRED</prop>
            </props>
        </property>
    </bean>
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
        <property name="beanNames">
            <list>
                <value>*Dao</value>
            </list>
        </property>
        <property name="interceptorNames">
            <list>
                <value>transactionInterceptor</value>
            </list>
        </property>
    </bean>
    注:   <value>*Dao</value>为需要进行事务处理的bean名称,可以使用模糊匹配

你可能感兴趣的:(DAO,spring,多线程,Hibernate,配置管理)