我们正在使用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。对于所有其他事务配置,这似乎是多余的。我们错过了什么吗?或者这是达到要求的建议方式吗?
谢谢!
答案 0 :(得分:1)
我认为如果你使用Session。doWork作为你的JDBC代码,你可以使用Hibernate和你的JTA DataSource来获得更少的配置麻烦。
您不需要TransactionAwareDataSourceProxy,因为您仍然想要使用交易服务,而不是在交易服务之外调用DAO类。
您需要添加:
<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>
在我们最近开发的一个应用程序中,我们混合了JPA和JDBCTemplate,它运行良好,因为Bitronix PoolingDataSource被指示始终为当前运行的线程返回相同的连接。
为此,您必须设置以下Bitronix property:
shareTransactionConnections=true