每当在Query中使用insert批注(updatedeleteJpaRepository)实现数据修改逻辑时,都必须同时使用@Transactional(不一定在存储库方法上)和@Modifying

我的理解如下。除非我们覆盖JpaRepository提供的所有Crud操作,否则它们都是事务性的。在存储库中实现方法时,我们需要确保它仍然是事务性的。可以简单地通过用@Transactional注释来实现。 readOnly的默认值是false,因此spring“知道”这是一个修改查询。

问题是:为什么我们需要@Modifying注释(连同@Transactional一起)?也许我想念什么?

我知道像thisthat这样的讨论,但是我没有明确解释为什么如果@Modifying携带了所有需要的信息就必须使用@Transactional

最佳答案

reference docs


  默认情况下,存储库实例上的CRUD方法是事务性的。
  对于读取操作,事务配置readOnly标志为
  设置为true。其他所有配置为普通的@Transactional,因此
  该默认交易配置适用。


@Modifying回答了为什么我们为什么需要@Modifying注释?


  指示应将查询方法视为将查询修改为
  改变了它执行的方式。此注释仅
  考虑是否用于通过查询定义的查询方法
  注解)。它不适用于自定义实现方法或
  从方法名称派生的查询,因为它们已经可以控制
  基础数据访问API或指定它们是否正在被以下人员修改
  他们的名字。
  
  需要@Modifying批注的查询包括INSERT,UPDATE,
  DELETE和DDL语句。


also


  @Modifying注释仅与
  @Query注释。派生的查询方法或自定义方法不
  需要此注释。


(与@Transactional一起)

@Transactional@Modifying一起不是必需的。只是用@Modifying注释的方法应该在事务中执行。

10-08 01:58