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 方法上加事务注解也是可以的。

这样就完美的解决了这个问题。

总结

  1. 可以通过自定义的 JPQL 完成 UPDATE 和 DELETE 操作。
  2. @Query 注解中编写 JPQL 更新语句,但必须使用 @Modifying 进行修饰以通知 SpringData,这是一个 UPDATE 或 DELETE 操作。
  3. UPDATE 或 DELETE 操作需要使用事务,此时需要定义 Service 层,在 Service 层的方法上添加事务操作。
  4. 默认情况下,SpringData 的每个方法上有事务,但都是一个只读事务,他们不能完成修改操作。
如果觉得这对你有用,请随意赞赏,给与作者支持
评论 0
最新评论