当前位置: 首页 > 面试题库 >

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

姚星腾
2023-03-14
问题内容

我只有一个数据源,我使用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>

问题答案:

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

我使用的是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)。
请注意,这需要配置特定于供应商的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>


 类似资料:
  • 问题内容: 我只有一个数据源,我使用Spring 3.0.3,Hibernate 3.5.1作为JPA提供程序,并且使用MyBatis 3.0.2进行某些查询,并且我的应用程序在Tomcat 6上运行。当我同时调用HibernateDAO和MyBatisDAO时,从@Transactional注释的同一方法中,它们似乎不共享同一事务,它们获得了不同的连接。 我该怎么做? 我尝试从DataSourc

  • 问题内容: 我有一个胖客户端,带有25个表和约15个JInternalFrames(表的数据输入表单)的架构的java swing应用程序。我需要为DBMS交互选择直接的JDBC或ORM(在这种情况下为Spring框架hibernate)的设计选择。应用程序的构建将在将来发生。 对于这样规模的项目,hibernate会过大吗?对于是或否答案的解释将不胜感激(如果需要,甚至可以采用其他方法)。 TI

  • 问题内容: 我将jaybird 2.2.3和hibernate 3.5一起使用,当我使用向导hibernate映射文件和pojos数据库时,出现以下错误“ java.lang.NullPointerException” 我在mysql上使用了相同的映射,并且可以正常工作,所以我相信这是jaybird中的问题 编辑: 有人能帮我吗? 问题答案: 在深入研究了Netbeans的代码并向Jaybird添

  • 最近,我注意到Spring Data JDBC,所以我决定在一个新的Spring Boot(2.3.1)应用程序中使用它。在我的用例中,我有一个包含两类表的DB模式: 用于存储应用程序(更复杂的)业务逻辑所使用的实体的表。我使用Spring Data JPA(带有底层Hibernate)来处理它们。 表,用于存储彼此之间没有太多关系的简单数据记录(例如来自外部系统的数据记录)。我决定对它们使用Sp

  • 问题内容: 我有一个专门用于通过休眠的持久层将数据持久保存在db中的类。 问题在于它不保留数据。 堆栈是: 但我必须指出,它在其他课程中也能正常工作。 更新 : 当我把它印出来的时候给我。 更新 我试图获得更多有关该错误的信息: 我知道问题出在哪里: 实际上,该表对同一张表有2 fk ,而我,我坚持的是 问题答案: 可能引发了异常。这意味着该子句中没有要回滚的活动事务。这就是为什么引发另一个异常(

  • 问题内容: 有人可以透视一下JPA和Hibernate之间的区别吗?还是将这些互补的概念一起使用? 问题答案: 大致来说,JPA是java社区的一个标准,这里是specs,它是由Hibernate家伙实现(并扩展)的(此处提供一些信息)。作为规范,您将不会直接使用JPA,而是使用JPA实现。 请注意,如果要使用hibernateJPA扩展,将破坏与其他JPA实现的兼容性(尽管有些人会说“为什么要使