Spring事务管理一起使用JDBC和Hibernate 4

时间:2014-12-07 12:06:08

标签: java spring hibernate jpa transactions

我们正在使用JPA(Hibernate 4)和Spring 4来管理JTA事务。由于应用程序的某些部分也使用JDBC来访问数据库,因此我们需要确保JDBC和JPA加入同一个事务,以查看另一个在提交之前更改的内容。

您可以在GitHub上找到这些问题的测试用例https://github.com/abenneke/sandbox/tree/master/spring-hibernate4-transaction

要让JDBC和JPA加入同一个事务并查看其他事务所做的更改,我们还必须使用TransactionAwareDataSourceProxy进行Hibernate / JPA。对于所有其他事务配置,这似乎是多余的。我们错过了什么吗?或者这是达到要求的建议方式吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

  1. 我认为如果你使用Session。doWork作为你的JDBC代码,你可以使用Hibernate和你的JTA DataSource来获得更少的配置麻烦。

  2. 您不需要TransactionAwareDataSourceProxy,因为您仍然想要使用交易服务,而不是在交易服务之外调用DAO类。

  3. 您需要添加:

    <bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"/>
    

    并确保将其提供给testEntityManager

    <bean id="testEntityManager" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
         <property name="dataSource" ref="testDataSource">
         ...
         <property name="jpaDialect" ref="jpaDialect"/>
    </bean>
    
  4. 更新

    在我们最近开发的一个应用程序中,我们混合了JPA和JDBCTemplate,它运行良好,因为Bitronix PoolingDataSource被指示始终为当前运行的线程返回相同的连接。

    为此,您必须设置以下Bitronix property

    shareTransactionConnections=true