如何配置Spring以使JPA(休眠)和JDBC(JdbcTemplate或MyBatis)共享同一事务

如何解决如何配置Spring以使JPA(休眠)和JDBC(JdbcTemplate或MyBatis)共享同一事务?

开发过程中遇到如何配置Spring以使JPA(休眠)和JDBC(JdbcTemplate或MyBatis)共享同一事务的问题如何解决?下面主要结合日常开发的经验,给出你关于如何配置Spring以使JPA(休眠)和JDBC(JdbcTemplate或MyBatis)共享同一事务的解决方法建议,希望对你解决如何配置Spring以使JPA(休眠)和JDBC(JdbcTemplate或MyBatis)共享同一事务有所启发或帮助;

问题描述

在这里找到了解决方案:我应该为JBDC模板使用哪个事务管理器?

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

该事务管理器 。这允许混合访问JPA的服务和使用纯JDBC的服务(无需了解JPA)!应用程序代码需要遵循与DataSourceTransactionManager相同的简单连接查找模式(即DataSourceUtils.getConnection(javax.sql.DataSource)或通过TransactionAwareDataSourceProxy)。

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

解决方法

我只有一个数据源,我使用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也会始终提供相同的连接,这没关系。

经过一些谷歌搜索后,我尝试了spring-instrument-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>
喜欢与人分享编程技术与工作经验,欢迎加入编程之家官方交流群!

猜你在找的编程问答相关文章

怎样才能让 Git“忘记”一个被跟踪但现在在 .gitignore 中的文件?
Python 中的metaclasses是什么?
如何在 Linux 上查找包含特定文本的所有文件?
如何从异步调用返回响应
如何在一个表达式中合并两个字典(取字典的并集)?
HTTP 中的 POST 和 PUT 有什么区别?
使用 Git 将最近的提交移动到新分支
在 JavaScript 比较中应该使用哪个等于运算符 (== vs ===)?
微信公众号搜索 “ 程序精选 ” ,选择关注!
微信公众号搜 "程序精选"关注