每当使用JpaRepository
中的Query
注释(insert
、update
或delete
)实现数据修改逻辑时,都必须使用@Transactional
(不必在存储库方法上)和@Modify
。
我的理解如下。JpaRepository提供的所有crud操作都是事务性的,除非我们覆盖它们。在存储库中实现方法时,我们需要确保它仍然是事务性的。它可以通过使用@Transactional
进行注释来实现。readOnly
的默认值是false
,因此spring“知道”这是一个修改查询。
问题是:为什么我们需要@修改
注释(以及@Transactional
)?也许我错过了什么?
我知道这样或那样的讨论,但是我缺少一个明确的解释,即如果< code>@Transactional包含所有需要的信息,为什么必须使用< code > @ modificing 。
从参考文档
默认情况下,存储库实例上的CRUD方法是事务的。对于读操作,事务配置只读标志设置为true。所有其他方法都配置为普通的@Transactionic,以便应用默认事务配置。
而@Modi的回答了为什么我们需要@Modi的注解呢?
指示应将查询方法视为修改查询,因为这会更改查询的执行方式。只有在通过query注释定义的查询方法上使用此注释时,才会考虑此注释)。它不适用于自定义实现方法或从方法名称派生的查询,因为它们已经可以控制底层数据访问API,或者指定它们是否按名称进行修改。
需要< code > @ modificing 注释的查询包括INSERT、UPDATE、DELETE和DDL语句。
也
@Modifying注释只与@Query注释结合使用。派生查询方法或自定义方法不需要此批注。
(连同@Transactional)
@Transactional
不需要与@修改
一起使用。只是用@Modification
注释的方法应该在事务中执行。