• Write operations are not allowed in read-only mode (FlushMode.MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition.


    最近在配置 Structs, spring 和hibernate整合的问题:

    开启OpenSessionInViewFilter来阻止延迟加载的错误的时候抛出了这个异常:

        org.springframework.dao.InvalidDataAccessApiUsageException错误

    但是在我们开启OpenSessionInViewFilter这个过滤器的时候FlushMode就已经被默认设置为了MANUAL!

    如果FlushMode是MANUAL或NEVEL,在操作过程中 hibernate会将事务设置为readonly,所以在增加、删除或修改操作过程中会出现如下错误:

    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;

    解决办法1:

        直接修改OpenSessionInViewFilter过滤器的配置,配置过滤器的时候配置就是在一般的配置里面加上下面蓝色部分就可以了,直接指定flushMode的配置就OK了:

    下面是配置文件:(web.xml)

    <filter>
    
         <filter-name>OpenSessionInViewFilter</filter-name>
    
          <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
    
           <init-param> 
    
               <param-name>flushMode</param-name> 
    
               <param-value>AUTO</param-value> 
    
           </init-param>
    
    </filter>
    
    <filter-mapping>
    
         <filter-name>OpenSessionInViewFilter</filter-name>
    
         <url-pattern>/*</url-pattern>
    
    </filter-mapping>

    解决方法2:

        就是配置事务的边界,在你方法的执行时配置事务边界!

    下面是sessionFactor.xml配置:

    <!-- 事务的配置 -->
    
        <!-- sessionFactory 为自己配置 sessionFactory 的 bean-->
    
        <bean id="txManager"
    
            class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    
            <property name="sessionFactory" ref="sessionFactory" />
    
        </bean>
    
       
    
        <aop:config>
    
             <!-- execution(public * *.*.*..*.*(..)) 为自己项目中操作数据库中的方法 -->
    
            <aop:pointcut id="**" expression="execution(public * *.*.*..*.*(..))" />
    
            <aop:advisor pointcut-ref="**"
    
                advice-ref="txAdvice" />
    
        </aop:config>
    
     
    
        <tx:advice id="txAdvice" transaction-manager="txManager">
    
            <tx:attributes>
    
                 <!-- name 为 方法名 -->
    
                <tx:method name="**" read-only="true" />
    
                <tx:method name="**" propagation="REQUIRED"/>
    
            </tx:attributes>
    
        </tx:advice>

    下面是总结:

    原理:因为配置openSessionInView时,启动后他默认是给没有配置事务边界的方法都默认为只读的,所以在插入数据时就会报上面的错

    如果出现该错误,检查事务边界配置是否正确

    原文地址:http://blog.csdn.net/enterys/article/details/7927840

  • 相关阅读:
    oarcle 提取数字函数
    通用XML操作类(微型本地xml数据库)
    linux内核模块Makefile的解析
    开源的许可证GPL、LGPL、BSD、Apache 2.0的通俗解释
    弹性布局
    CSS基础知识
    HTML5基本标签
    VS2008开发Windows Mobile6环境搭建及模拟器联网问题图解
    .Silverlight Binding (One Time,One Way,Two Way)
    WCF Service中HttpContext.Current为null的解决办法
  • 原文地址:https://www.cnblogs.com/djoker/p/6443978.html
Copyright © 2020-2023  润新知