org.springframework.dao.InvalidDataAccessApiUsageException: Write operations are not allowed in read

最近遇到如题的这个问题, 解决了好几个小时都是无果,自己百度,都是说在web.xml中加上一段filter就可以,但是我的搞了好久,依旧不行,今天早上再次查找资料的时候,终于解决了,先说一下,强烈建议以后有问题的可以上 http://stackoverflow.com/看看,虽然看上去都是英语,但是稍微有点基础还是都能看懂的,关键不要慌,而且主要看代码,所以这是一个非常棒的社区,强烈推荐


我的问题就如题目所说的样子,关键,而且百度上的都解决不了,先说我的解决方式。我在web.xml中没有加filter

我的web.xml是这样的:和普通的写法一样

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
 
 <!-- 用来定位Spring XML文件的上下文配置 -->
	  <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext*.xml</param-value>
    </context-param>  
 <!-- 启动 Spring Bean 工厂的监听器-->
    <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>  
 
  <!-- 启动 Struts 2 的过滤器-->
 
   	<filter>
		<filter-name>struts2</filter-name>
		<filter-class>
			 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter 
		</filter-class>
	</filter>
	
	<filter-mapping>
		<filter-name>struts2</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping> 
	
	
	 
	
	 	<!-- 解决中文字符乱码 -->
    <filter>
		<filter-name>Set Character Encoding</filter-name>
		<filter-class>
			org.springframework.web.filter.CharacterEncodingFilter
		</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>utf-8</param-value>
		</init-param>
		<init-param>
			<param-name>forceEncoding</param-name>
			<param-value>true</param-value>
		</init-param>
	</filter>
 
</web-app>


关键是我在applicationContext.xml中的关于事务管理器的写法如下:

<!-- 配置spring的声明式事务 -->
    <!-- 1.配置hibernate的事务管理器 -->
    <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
       <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>
    <!-- 2.配置事务属性 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
       <tx:attributes>
         <tx:method name="get*" read-only="true"/>
         <tx:method name="*"/>
       </tx:attributes>
    </tx:advice>
    <!-- 3.配置事务切入点,再把事务属性和事务切入点关联起来 -->
    <aop:config>
       <aop:pointcut expression="execution(* com.service.*.*(..))" 
       id="txPointCut"/>
       <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/>
    </aop:config>


1.如果这样写了,有可能会缺包或者缺少命名空间,这个容易加上就好

2.我的

       <aop:pointcut expression="execution(* com.service.*.*(..))" 
这个的写法是我的service的包名字,我web project的构造如下:




我的service都是在com.service.serviceImp.java.中,所以这个地方按自己的工程需要改写,其他的地方几乎都是常规的,这样我的hibernateTemplate在执行基本操作的时候就没有报错了


由bug,年轻人,别慌,慢慢来,你要耗得的起
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值