Spring JPA 报错:Not supported for DML operations
原创
jpa
问题:Not supported for DML operations
在运行 JPA update
修改数据代码报 Not supported for DML operations
错误。
@Query(value = "update User user set user.address = :address where user.id = :id ")
void findByUpdateUser(@Param("id") int id,@Param("address") String address);
解决方案
解决办法就是在上面加上 @Modifying
注解。
@Modifying(clearAutomatically = true)
@Query(value = "update User user set user.address = :address where user.id = :id ")
void findByUpdateUser(@Param("id") int id,@Param("address") String address);
运行上面代码你会发现又会报 Executing an update/delete query
的错,这是因为 JPA 更新操作需要事务支持,需要加 @Transactional
注解。
需要在你的在业务类 Service 类上面 @Service
注解那添加事务注解 @Transactional
就好了。精细一点的话,只在需要更新的 Service 方法上加事务注解也是可以的。
这样就完美的解决了这个问题。
总结
- 可以通过自定义的 JPQL 完成 UPDATE 和 DELETE 操作。
- 在
@Query
注解中编写 JPQL 更新语句,但必须使用@Modifying
进行修饰以通知 SpringData,这是一个 UPDATE 或 DELETE 操作。 - UPDATE 或 DELETE 操作需要使用事务,此时需要定义 Service 层,在 Service 层的方法上添加事务操作。
- 默认情况下,SpringData 的每个方法上有事务,但都是一个只读事务,他们不能完成修改操作。