今天在做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 文件,我照做,还是没解决问题
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 文件,我照做,还是没解决问题
System。out.println(getHibernateTemplate().getFlushMode())
是否为(FlushMode.NEVER/MANUAL;
增加:
getHibernateTemplate.setFlushMode(FlushMode.AUTO);看看
getHibernateTemplate().update(bean);
getHibernateTemplate().flush()
改:
<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>
<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 了
非常感谢美女程序员这份无私的………………
<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>
//super.getSession().save(p);
执行上面的方法IDE不报错也不处警告,单步跟踪正常执行,但数据库中就是没有数值 this.getHibernateTemplate().save(planyear);
getHibernateTemplate().flush() ;
采纳本贴中的内容之后,修改为以上的方法数据插入正常,很是不解。
getHibernateTemplate().flush() 这是干什么的?