1. 程式人生 > >spring-data-jpa(三) ->今天踩的坑

spring-data-jpa(三) ->今天踩的坑

最近升級使用了Spring boot 2.0 發現Service層報錯時,事物仍然進行了提交。通過查詢各方資料。大致原因歸納為一下幾種:

1、檢查你方法是不是public的

2、你的異常型別是不是unchecked異常 
如果我想check異常也想回滾怎麼辦,註解上面寫明異常型別即可

@Transactional(rollbackFor=Exception.class) 
1
類似的還有norollbackFor,自定義不回滾的異常

3、資料庫引擎要支援事務,如果是MySQL,注意表要使用支援事務的引擎,比如innodb,如果是MyISAM,事務是不起作用的。

我的主要是第三種原因造成的。

Spring Boot 2.0使用data Jpa時。建立表預設使用的是MyISAM引擎,但是Mysql MyISAM引擎是不支援事務的。所以把資料庫的表改為innodb 引擎就行了。

--------------------------- 不想一個個改表的儲存結構?繼續往下看---------------

但是,有沒有一勞永逸的方法呢?

有的!

Spring Boot 2.0 使用的Jpa 版本是2.0.0

<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>2.0.0.RELEASE</version>
這個版本的JPA使用的是hibernate 5.2.14

在這個版本中 之前一直使用的方言被廢棄了 MySQL5InnoDBDialect 已經被廢棄了。MySQL5InnoDBDialect 主要適用於MySQL5.5版本,5.5之後的版本,hibernate給出了其他的解決方案,MySQL55Dialect 和 MySQL55Dialect ()

所以5.5以後的版本根據mysql的版本,需要採用合適的方言。例如,我是用的mysql5.6的所以就最後使用 MySQL5InnoDBDialec

所以修改spring jpa配置如下 我使用的是yml

jpa:
  database: MYSQL
  hibernate:
    ddl-auto: update
  show-sql: true
  database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
這裡就不需要配置 hibernate 的dialect 了

把之前的表刪掉,重啟看一下吧,現在建立的表都是innoDB引擎了。並且@Transactional 再報錯,事務也可以回滾了。



原文:https://blog.csdn.net/kylinregister/article/details/80678223