提问者:小点点

为什么我必须在spring data jpa中使用@Modifying with @Transactional?


每当使用JpaRepository中的Query注释(insertupdatedelete)实现数据修改逻辑时,都必须使用@Transactional(不必在存储库方法上)和@Modify

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

问题是:为什么我们需要@修改注释(以及@Transactional)?也许我错过了什么?

我知道这样或那样的讨论,但是我缺少一个明确的解释,即如果< code>@Transactional包含所有需要的信息,为什么必须使用< code > @ modificing 。


共1个答案

匿名用户

从参考文档

默认情况下,存储库实例上的CRUD方法是事务的。对于读操作,事务配置只读标志设置为true。所有其他方法都配置为普通的@Transactionic,以便应用默认事务配置。

而@Modi的回答了为什么我们需要@Modi的注解呢?

指示应将查询方法视为修改查询,因为这会更改查询的执行方式。只有在通过query注释定义的查询方法上使用此注释时,才会考虑此注释)。它不适用于自定义实现方法或从方法名称派生的查询,因为它们已经可以控制底层数据访问API,或者指定它们是否按名称进行修改。

需要< code > @ modificing 注释的查询包括INSERT、UPDATE、DELETE和DDL语句。

@Modifying注释只与@Query注释结合使用。派生查询方法或自定义方法不需要此批注。

(连同@Transactional)

@Transactional不需要与@修改一起使用。只是用@Modification注释的方法应该在事务中执行。