項目中使用了spring jpa與spring jdbc但在實際使用中發現spring jdbc中的事務沒有被提交到,處理方式主要有以下幾點
- 確保工程中啟用了事務
@EnableTransactionManagement
- 確保在方法上添加了事務註釋
@Transactional
這兩點在系統中都已經添加,但還是不生效,查看spring jpa的文檔發現確實是支持jpa的事務和jdbc的事務https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/orm/jpa/JpaTransactionManager.html
,通過debug發現Jpa的事務處理主要在JpaTransactionManager.doBegin
中,在執行時會判斷是否使用jdbc的事務;
系統中指定了JpaTransactionManager
但沒有指定jpaDialect
,如果不指定默認給的是DefaultJpaDialect
,而DefaultJpaDialect
中並不會對JdbcConnection
做處理,所以就導致了jdbc事務無法提交,解決辦法也比較簡單手動指定jpaDialect
為HibernateJpaDialect
;
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager" primary="true">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
<property name="jpaDialect">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaDialect"></bean>
</property>
</bean>