论坛首页 入门技术论坛

将事务配置代码从spring1.x切换到spring2.x后,出现不能修改数据的问题

浏览 1589 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-03-19  
应用里配置了OpenSessionInView,并且设置singleSession为true。以前使用1.x的事务配置一直都正常。配置如下:
<bean id="baseTxService"
		class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
		abstract="true">
		<property name="transactionManager" ref="transactionManager" />
		<!-- <property name="proxyTargetClass" value="true" />-->
		<property name="transactionAttributes">
			<props>
				<prop key="*">PROPAGATION_REQUIRED</prop>
			</props>
		</property>
		<property name="postInterceptors">
			<list>
				<bean
					class="org.springframework.orm.hibernate3.HibernateInterceptor">
					<property name="sessionFactory">
						<ref bean="sessionFactory" />
					</property>
				</bean>
			</list>
		</property>
	</bean>

	<bean id="userService" parent="baseTxService">
		<property name="target">
			<bean id="userServiceTarget"
				class="jbase.user.service.UserService">
				<property name="dao" ref="userDAO" />
				<property name="roleDAO" ref="roleDAO" />
			</bean>
		</property>
	</bean>


最近将事务配置换成了Spring2.0的风格,结果在update,save,delete操作时出现了那个经典的OpenSessionInView引起的错误:
 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.


配置如下
	<aop:config proxy-target-class="true">
		<aop:advisor pointcut="execution(* jbase..*UserService.*(..))"
			advice-ref="txAdvice" />
		<!-- 
			<aop:advisor pointcut="execution(* jbase..*DAO.*(..))"
			advice-ref="txAdvice" />
		-->
	</aop:config>

	<!-- 支持 @Transactional 标记 -->
	<tx:annotation-driven />

	<!-- 支持 @AspectJ 标记-->

	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>

			<tx:method name="delete*" propagation="REQUIRED"
				read-only="false" />
			<tx:method name="update*" propagation="REQUIRED"
				read-only="false" />
			<tx:method name="save*" propagation="REQUIRED"
				read-only="false" />
			<tx:method name="find*" propagation="REQUIRED"
				read-only="false" />

			<tx:method name="*"  read-only="false" />
		</tx:attributes>
	</tx:advice>

<bean id="userService" class="jbase.user.service.UserService">
		<property name="dao" ref="userDAO" />
	</bean>


根据原来的一些资料,只在事务是spring管理的,应该就不会出现这样的情况,spring会自动从OpenSessionInView取得session,并将它设置为Flush.Auto。
这个事务配置应该是起了作用,因为我在单元测试时测试了事务的完整性。
自己找了好久的资料一直没有解决,请大家帮忙?
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics