毕业论文开发语言企业开发JAVA技术.NET技术WEB开发Linux/Unix数据库技术Windows平台移动平台嵌入式论文范文英语论文
您现在的位置: 毕业论文 >> java技术 >> 正文

Spring中OpenSessionInViewFilter设置FlushMode为NEVER的问题

更新时间:2012-8-2:  来源:毕业论文

<context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:applicationContext-*.xml</param-value>
  </context-param>
 
  <filter>
      <filter-name>OpenSessionInViewFilter</filter-name>
      <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
  </filter>
 
  <filter-mapping>
      <filter-name>OpenSessionInViewFilter</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>
 
  <listener>
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener

 

applicationContext-common.xml的配置

XML code
    <!-- 配置SessionFactory -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="configLocation">
            <value>classpath:hibernate.cfg.xml</value>
        </property>
    </bean>
   
    <!-- 配置事务管理器 -->
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory">
            <ref bean="sessionFactory"/>
        </property>
    </bean>
   
    <aop:config>
        <aop:pointcut id="allMethod" expression="execution(* com.xiaobao.basedata.manager.*.*(..))"/>
        <aop:advisor advice-ref="transactionAdvice" pointcut-ref="allMethod"/>
    </aop:config>
   
    <tx:advice id="transactionAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="add*" propagation="REQUIRED"/>
            <tx:method name="del*" propagation="REQUIRED"/>
            <tx:method name="modify*" propagation="REQUIRED"/>
            <tx:method name="upload*" propagation="REQUIRED"/>
            <tx:method name="*" propagation="REQUIRED"/>
        </tx:attributes>
    </tx:advice>

 


当我通过DAO层用getHibernateTemplate().save(item);去保存的时候会报 Write operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from transaction definition. 错误,
我到晚上查了下,是因为OpenSessionInViewFilter默认会将session的FlushMode设置成NEVER只读模式导致的
问题来了我不是已经在applicationContext中配置了切入点订阅的哪些joinpoint吗,默认 read-only="false"的不是只读的
既然这样就算OpenSessionInViewFilte会默认设置session的FlushMode值,但是当调用了匹配的方法时transaction会去修改
session的FlushMode的值吗,如果会修改那么save时为什么还会报错呢,

还一个问题,网上很多人说在save前可以手动的去设置FlushMode值,或者通过filter传递参数  

XML code
   <init-param>
        <param-name> flushMode </param-name>
   <param-value>AUTO </param-value>        
        </init-param>


我都试过了第一种去手动设置虽然不会报错,但是没有执行sql语句,数据库当然也不会有
第二种,我也试了直接不起作用依然报错,我看了下filter的源代码,它是直接默认设置的

Java code
protected Session getSession(SessionFactory sessionFactory) throws DataAccessResourceFailureException {
        Session session = SessionFactoryUtils.getSession(sessionFactory, true);
        session.setFlushMode(FlushMode.NEVER);
        return session;
    }


根本就没有根据传递过来的参数值去设置FlushMode这有是怎么回事呢,网上很多人都说这种方法管用
难道是我们spring版本问题?2.0应该也不会有问题吧,还是我的配置有问题,望大侠们指点迷津啊
 
 
<tx:advice id="transactionAdvice" transaction-manager="transactionManager">
  <tx:attributes>
  <prop key="save*">REQUIRED</prop>  ............ 

设为首页 | 联系站长 | 友情链接 | 网站地图 |

copyright©youerw.com 优尔论文网 严禁转载
如果本毕业论文网损害了您的利益或者侵犯了您的权利,请及时联系,我们一定会及时改正。