天天看點

Spring JPA無法送出jdbc事務的解決辦法

項目中使用了spring jpa與spring jdbc但在實際使用中發現spring jdbc中的事務沒有被送出到,處理方式主要有以下幾點

  1. 確定工程中啟用了事務
@EnableTransactionManagement           
  1. 確定在方法上添加了事務注釋
@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的事務;

Spring JPA無法送出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>