2011-07-21 690 views
24

我有一個數據源,我使用Spring 3.0.3,Hibernate 3.5.1作爲JPA提供程序,我使用MyBatis 3.0。 2的一些查詢和我的應用程序在Tomcat 6上運行。我有一個HibernateDAO和一個MyBatisDAO,當我使用@Transactional註釋的相同方法調用它們時,它看起來像不共享相同的事務,它們獲得不同的連接。
我該如何讓他們做?如何配置Spring使JPA(Hibernate)和JDBC(JdbcTemplate或MyBatis)共享相同的事務

我試過從DataSourceUtils.getConnection(dataSource)獲取連接,我得到MyBatis使用的是奇怪的,我認爲問題出現在MyBatis配置中,它不能使用JpaTransactionManager。即使多次調用DataSoruceUtils.getConnection也會始終提供相同的連接,這沒關係。

一些google搜索後,我已經試過彈簧儀器tomcat的類加載器(雖然我不知道如果Tomcat真的使用它:))

部分的applicationContext

<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> 

局部的persistence.xml

<persistence-unit name="persistenceUnit" transaction-type="RESOURCE_LOCAL"> 
<provider>org.hibernate.ejb.HibernatePersistence</provider> 

回答

34

我發現這裏的解決方案:What transaction manager should I use for JBDC template When using JPA ?

我使用JpaTransactionManager接口,而不是DataSourceTransactionManager對象。
的JavaDoc http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/orm/jpa/JpaTransactionManager.html

該事務管理器還支持事務中直接訪問數據源(即普通的JDBC代碼具有相同的數據源工作)。這允許混合使用JPA的服務和使用普通JDBC的服務(不需要知道JPA)!應用程序代碼需要使用與DataSourceTransactionManager(即DataSourceUtils.getConnection(javax.sql.DataSource)或通過TransactionAwareDataSourceProxy)相同的簡單Connection查找模式。 請注意,這需要配置供應商特定的JpaDialect。

後我添加jpaVendorAdapter我的entityManagerFactory配置一切正常,既JdbcTemplate的查詢和MyBatis的預期在同一個事務中運行。基於JavaDoc,我猜jpaDialect應該足夠了,但現在是凌晨4點。在這裏,所以我不會嘗試,現在:)

<bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory"> 
    <property name="persistenceUnitName" value="persistenceUnit"/> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
      <property name="showSql" value="true" /> 
      <property name="generateDdl" value="true" /> 
      <property name="databasePlatform" value="org.hibernate.dialect.PostgreSQLDialect" /> 
     </bean> 
    </property> 
</bean> 
+0

是的,只是設置jpa方言工作'emf.setJpaDialect(new HibernateJpaDialect());' –

-2

嘗試使用:

<bean class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
    <property name="dataSource" ref="dataSource"/> 
</bean> 
這直接操作JDBC水平

。所有持久化抽象(JPA/iBatis和JdbcTemplate)最終都使用JDBC,因此您需要處理最高級別的事務。

在你的情況下,你正在使用JpaTransactionManager,通過javax.persistence.EntityTransaction抽象處理交易。顯然,iBatis並不知道JPA事務,因此大概它在它之外工作。

你不需要任何類加載器/儀器的魔法,應該只是工作。

+0

不幸的是,這似乎並不奏效。 – tewe

+0

「請注意,這需要配置供應商特定的JpaDialect。」 tewe nailed the problem- – chrismarx

4

我還沒有在混合MyBatis的,但作爲tewe提示只需添加到JpaDialect的的transactionManager的太做這項工作。

<bean class="org.springframework.orm.jpa.JpaTransactionManager" 
    id="transactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory" /> 
    <property name="jpaDialect"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" /> 
    </property> 
</bean>