为什么JPA数据源事物需要指定默认的事务管理,且为默认的事务管理

spring3中对@Transactional进行了改进,加了个value属性,让用户可以指定使用哪个事物管理机制。可以参考这里
http://liuu.iteye.com/blog/973218

这次我的项目中用到了jpa和mybatis两种事物管理机制。我在配置文件中这样配置
<tx:annotation-driven/>

<bean id="transactionManager_jpa" class="org.springframework.orm.jpa.JpaTransactionManager">
		<property name="entityManagerFactory" ref="entityManagerFactory"/>
<qualifier value="jpa"/>
</bean>

<bean id="transactionManager_mybatis" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource"/>
		<qualifier value="mybatis"/>
	</bean>


结果跑使用jpa事物代码时老是报No bean named transactionManager is defined,报的位置是操作dao的那行。于是我就去看了下jap的dao类的父类。发现SimpleJpaRepository使用的是默认的事物管理机制。
@org.springframework.stereotype.Repository
@Transactional(readOnly = true)
public class SimpleJpaRepository<T, ID extends Serializable> implements JpaRepository<T, ID>,
		JpaSpecificationExecutor<T> {

.....
@Transactional
	public <S extends T> S save(S entity) {

		if (entityInformation.isNew(entity)) {
			em.persist(entity);
			return entity;
		} else {
			return em.merge(entity);
		}
	}

.....

}


也就是说,使用JPA数据源时,必须配置默认事物管理机制。且JPA的事物管理是必须为默认指定的事物管理。

你可能感兴趣的:(transactional,jpa,spring事物配置)