今天在做spring2.x+struts2.0+hibernate3.x的项目时候,在执行更新操作的时候,出现的问题,大家帮助给看一下:org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read-only mode (FlushMode.NEVER/MANUAL): Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' er from transaction definition.
at org.springframework.orm.hibernate3.HibernateTemplate.checkWriteOperationAllowed(HibernateTemplate.java:1095)
at org.springframework.orm.hibernate3.HibernateTemplate$14.doInHibernate(HibernateTemplate.java:656)
at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:372)
at org.springframework.orm.hibernate3.HibernateTemplate.update(HibernateTemplate.java:654)
at org.springframework.orm.hibernate3.HibernateTemplate.update(HibernateTemplate.java:650)
at com.dacc.dcp.dao.impl.DPourRecordDAO.saveOrUpdateDPourRecord(DPourRecordDAO.java:61)
at com.dacc.pp.service.impl.DHeatRecordService.saveOrUpdateDPourRecord(DHeatRecordService.java:29)
at com.dacc.pp.action.Pouring_updateWheelAction.updateWheelInfo(Pouring_updateWheelAction.java:52)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

----------------------------------------------------------------------------------------
web.xml
<!-- 配置spring监听 -->
  <context-param>  
  <param-name>contextConfigLocation</param-name>  
  <param-value>/WEB-INF/classes/bean.xml</param-value>  
  </context-param>  
  <!-- 开启监听 -->
  <listener>         
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
  </listener>
  <!--session的管理.使用HibernateTemplate操作数据库时,可以不对session进行显示的操作,spring可以自动处理session的打开与关闭  -->
  <filter>  
        <filter-name>lazyLoadingFilter</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>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
  </filter>
  <filter-mapping>
     <filter-name>lazyLoadingFilter</filter-name>
     <url-pattern>*.action</url-pattern>
  </filter-mapping>
  <filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>
----------------------------------------------------------------------------------------
spring 配置文件<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
<!-- 配置事务拦截器Bean -->
<bean id="transactionInterceptor" 
class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager">
<ref local="transactionManager"/>
</property>
<property name="transactionAttributes">
<props>
<prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
<prop key="save*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<!-- 定义BeanNameAutoProxyCreator 后处理器 -->
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<!-- 下面是需要自动自动创建事务代理的bean -->
<property name="beanNames">
<list>
<value>DHeatRecordServiceImpl</value>
<value>DPourRecordServiceImpl</value>
</list>
<!--此处可增加其他需要自动创建事务代理的bean -->
</property>
<property name="interceptorNames">
<list>
<!-- 此处可增加新的拦截器 -->
<value>transactionInterceptor</value>
</list>
</property>

</bean>

<!-- 配置DAO -->
        ......---------------------------------------------------------------------------------
Dao 层 public int saveOrUpdateDPourRecord(DPourRecord vo){
log.debug("save or update object");

DPourRecord bean = findDPourRecordByWheelCode(vo.getWheelCode());
System.out.println(bean.getPourId());
bean.setWheelCode(vo.getWheelCode());
bean.setCopeNo(vo.getCopeNo());
bean.setCopeScrap(vo.getCopeScrap());
bean.setTestCode(vo.getTestCode());
bean.setDragScrap(vo.getDragScrap());
bean.setSpecialUltra(vo.getSpecialUltra());
bean.setStates(vo.getStates());

try {
getHibernateTemplate().update(bean);
getHibernateTemplate().flush(); } catch (RuntimeException e) {
log.error("save or update object failed!");
e.printStackTrace(); }

return 0;
}
------//通过车轮号查找对象
public DPourRecord  findDPourRecordByWheelCode(String wheelCode){
log.debug("find id by wheelCode!");
List paramsList = new ArrayList();
List objectList = new ArrayList();
paramsList.add(wheelCode);
System.out.println(wheelCode);
String strSql = "From DPourRecord where wheel_code =?";
DPourRecord dpr;
try {
dpr =(DPourRecord) getHibernateTemplate().find(strSql, paramsList.toArray()).get(0);

} catch (RuntimeException e) {
log.error("find id by wheel_code is failed!");
throw e;
}
return dpr;
}---------------------
请大家帮助给看一下,项目着急在用!,在网上查的说去掉spring 配置文件不必要的readyOnly  ,还有说修改web.xml 文件,我照做,还是没解决问题

解决方案 »

  1.   

    你在这里打印
    System。out.println(getHibernateTemplate().getFlushMode())
    是否为(FlushMode.NEVER/MANUAL;
    增加:
    getHibernateTemplate.setFlushMode(FlushMode.AUTO);看看
    getHibernateTemplate().update(bean); 
    getHibernateTemplate().flush()
      

  2.   

    OpenSessionInViewFilter有一个变量flushMode,可通过getter setter为其赋值,而其默认值为FlushMode.NEVER
    改:
     <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter </filter-class>  
      <init-param> 
      <param-name>singleSession </param-name> 
      <param-value>true </param-value> 
    <param-name> flushMode </param-name> 
      <param-value>1</param-value> 
      </init-param>   </filter> 
      

  3.   

    呵呵,你提示的是正确的,不过我补充一下,我在配置web.xml 配置文件里面按照你提示的,修改为
    <filter>  
            <filter-name>lazyLoadingFilter</filter-name>  
    <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>  
       <init-param>
       <param-name>singleSession</param-name>
       <param-value>true</param-value>
       <param-name> flushMode </param-name> 
       <param-value>AUTO </param-value> 
       </init-param>
      </filter>执行程序就ok 了
    非常感谢美女程序员这份无私的………………
      

  4.   

    http://www.blogjava.net/landor2004/archive/2009/11/25/303701.html  或者参照这个,看一下
      

  5.   

    为什么我把这个配置去了也管用了呢?
    <filter>  
            <filter-name>lazyLoadingFilter </filter-name>  
    <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter </filter-class>  
      <init-param> 
      <param-name>singleSession </param-name> 
      <param-value>true </param-value> 
      <param-name> flushMode </param-name> 
      <param-value>AUTO </param-value> 
      </init-param> 
      </filter> 
      

  6.   

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

  7.   

    我遇到的问题很是奇怪
    //super.getSession().save(p);
    执行上面的方法IDE不报错也不处警告,单步跟踪正常执行,但数据库中就是没有数值  this.getHibernateTemplate().save(planyear);
      getHibernateTemplate().flush() ;
    采纳本贴中的内容之后,修改为以上的方法数据插入正常,很是不解。
    getHibernateTemplate().flush() 这是干什么的?