使用spring data jpa 的刪除操做,須要加註解@Modifying @Transactional 不然報錯以下: No EntityManager with actual transaction available for current thread - cannot reliably process 'remove' callspring
場景以下:sql
在service中,先執行 delete 操做,再執行 save操做3d
報錯以下:blog
No EntityManager with actual transaction available for current thread - cannot reliably process 'remove' call事務
在service層加上事務註解,依舊會報錯,並且在執行的sql中能夠看到僅執行insert語句,沒有執行delete語句rem
說明delete操做並無執行,因此在插入的時候,可能出現主鍵重複,惟一約束重複,報錯的狀況出現。it
解決方法:io
@Modifying做用:class
(1)能夠經過自定義的 JPQL 完成 UPDATE 和 DELETE 操做。 注意: JPQL 不支持使用 INSERT;
(2)在 @Query 註解中編寫 JPQL 語句, 但必須使用 @Modifying 進行修飾. 以通知 SpringData, 這是一個 UPDATE 或 DELETE 操做
(3)UPDATE 或 DELETE 操做須要使用事務,此時須要定義 Service 層,在 Service 層的方法上添加事務操做;
(4)默認狀況下, SpringData 的每一個方法上有事務, 但都是一個只讀事務。 他們不能完成修改操做。thread