使用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