Write operations are not allowed in read-only mod......

gaochc 2009-12-06 03:44:15
今天在做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' marker 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 文件,我照做,还是没解决问题
...全文
1931 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
yyzlln874 2010-06-07
  • 打赏
  • 举报
回复
了解,我也遇到这个问题了
一只小蚂蚁吆 2010-06-01
  • 打赏
  • 举报
回复
peipeihequnqun 2010-05-12
  • 打赏
  • 举报
回复
照你们的解决方案没能解决我的问题啊
laodaobazi01 2010-04-30
  • 打赏
  • 举报
回复
我遇到的问题很是奇怪
//super.getSession().save(p);
执行上面的方法IDE不报错也不处警告,单步跟踪正常执行,但数据库中就是没有数值



this.getHibernateTemplate().save(planyear);
getHibernateTemplate().flush() ;
采纳本贴中的内容之后,修改为以上的方法数据插入正常,很是不解。
getHibernateTemplate().flush() 这是干什么的?
laodaobazi01 2010-04-30
  • 打赏
  • 举报
回复
太感谢了,我今天也遇到同样的问题了,调试了一天,总算是解决了!!!
dcjz 2010-03-18
  • 打赏
  • 举报
回复
。。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.

不行。。
zhl510752056 2010-03-14
  • 打赏
  • 举报
回复
为什么我把这个配置去了也管用了呢?
<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>
locationkey 2010-03-09
  • 打赏
  • 举报
回复
还是没好,你这个怎么设置的啊
gaochc 2009-12-06
  • 打赏
  • 举报
回复
http://www.blogjava.net/landor2004/archive/2009/11/25/303701.html 或者参照这个,看一下
gaochc 2009-12-06
  • 打赏
  • 举报
回复
呵呵,你提示的是正确的,不过我补充一下,我在配置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 了
非常感谢美女程序员这份无私的………………
道光2008 2009-12-06
  • 打赏
  • 举报
回复
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>
道光2008 2009-12-06
  • 打赏
  • 举报
回复
你在这里打印
System。out.println(getHibernateTemplate().getFlushMode())
是否为(FlushMode.NEVER/MANUAL;
增加:
getHibernateTemplate.setFlushMode(FlushMode.AUTO);看看
getHibernateTemplate().update(bean);
getHibernateTemplate().flush()
gaochc 2009-12-06
  • 打赏
  • 举报
回复
补充一下,在执行对象更新操作的时候,控制台出现上面的错误提示的!~

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧