У меня есть один источник данных, я использую Spring 3.0.3, Hibernate 3.5.1 в качестве поставщика JPA, и я использую MyBatis 3.0.2 для некоторых запросов, и мое приложение работает на Tomcat 6. У меня есть HibernateDAO и MyBatisDAO, когда Я вызываю оба из одного и того же метода, который аннотирован @Transactional, похоже, что они не разделяют одну и ту же транзакцию, они получают разные соединения.
Как я могу заставить их делать?
Я попытался получить соединение от DataSourceUtils.getConnection (dataSource), и я получил тот, который используется MyBatis, что странно, я думал, что проблема была в конфигурации MyBatis, и он не может использовать JpaTransactionManager. Даже многократный вызов DataSoruceUtils.getConnection всегда дает одно и то же соединение, и это нормально.
После некоторого поиска в Google я попробовал загрузчик классов Spring-Instrument-Tomcat (хотя я не знаю, действительно ли tomcat использует его:))
частичное применениеКонтекст
<bean class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" id="dataSource">
<property name="driverClassName" value="${database.driverClassName}"/>
<property name="url" value="${database.url}"/>
<property name="username" value="${database.username}"/>
<property name="password" value="${database.password}"/>
</bean>
<bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<tx:annotation-driven mode="aspectj" transaction-manager="transactionManager"/>
<bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:META-INF/mybatis/mybatis-config.xml" />
</bean>
частичная конфигурация mybatis
<settings>
<setting name="cacheEnabled" value="false" />
<setting name="useGeneratedKeys" value="false" />
<setting name="defaultExecutorType" value="REUSE" />
<setting name="lazyLoadingEnabled" value="false"/>
</settings>
частичное сохранение.xml
<persistence-unit name="persistenceUnit" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>