5

Spring、Mybatis、および..Mybatis-springを使用して、Tomcat 7で実行されているアプリを持っています。

servlet-context.xml での DB とトランザクションのセットアップは次のとおりです。

<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 で簡単にセットアップできるのであれば、喜んで試してみたいと思います。

4

2 に答える 2

2

そして、私は自分で問題を解決しました。本当に簡単な解決策。誰かが同じ問題に遭遇した場合に備えて、私がする必要があるのは、sqlSessionFactoryBeanから次のものを削除することだけです。

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

必要だと思って入力したに違いありませんが、CMT (Container Managed Transactions) を使用していない場合にのみ必要なようです。

于 2013-07-12T23:14:34.530 に答える