SqlSessionFactory必须使用SpringManagedTransactionFactory才能使用Spring事务同步

时间:2013-07-12 22:28:14

标签: java spring transactions mybatis

我在Tomcat 7上运行了一个应用程序,使用Spring,Mybatis和.. Mybatis-spring。

这是servlet-context.xml中数据库和事务的设置:

<jee:jndi-lookup id="dataSource" jndi-name="jdbc/MyDS" />
<!-- enable the configuration of transactional behavior based on annotations -->
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
      <property name="dataSource" ref="dataSource" />
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
      <property name="dataSource" ref="dataSource" />
      <property name="mapperLocations" value="classpath*:maps/*.xml" />
      <property name="transactionFactory">
        <bean class="org.apache.ibatis.transaction.managed.ManagedTransactionFactory" />
      </property>  
</bean>
<mybatis:scan base-package="com.domain.dao.mappers" />
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory" />
</bean>

运行使用SqlSession的方法时遇到的错误如下:

org.springframework.dao.TransientDataAccessResourceException: SqlSessionFactory must be using a SpringManagedTransactionFactory in order to use Spring transaction synchronization
    at org.mybatis.spring.SqlSessionUtils.getSqlSession(SqlSessionUtils.java:136)

我做错了什么?

我的目标,实际上就是使用此设置进行交易。我认为我不需要JTA。但如果在Tomcat上设置这个很容易,我愿意接受它。

2 个答案:

答案 0 :(得分:1)

我自己解决了这个问题。真的很简单的解决方案如果有人遇到同样的问题,我需要做的就是从sqlSessionFactory bean中删除以下内容:

<property name="transactionFactory">
      <bean class="org.apache.ibatis.transaction.managed.ManagedTransactionFactory" />
</property> 

我必须以某种方式进入它,以为我需要它,但显然只有在你不使用CMT(容器管理事务)时才需要它。

答案 1 :(得分:0)

您可以通过将事务工厂更改为

来解决此问题
<property name="transactionFactory">
      <bean class="org.mybatis.spring.transaction.SpringManagedTransactionFactory" />
</property>