每当在Query
中使用insert
批注(update
,delete
或JpaRepository
)实现数据修改逻辑时,都必须同时使用@Transactional
(不一定在存储库方法上)和@Modifying
。
我的理解如下。除非我们覆盖JpaRepository
提供的所有Crud操作,否则它们都是事务性的。在存储库中实现方法时,我们需要确保它仍然是事务性的。可以简单地通过用@Transactional
注释来实现。 readOnly
的默认值是false
,因此spring“知道”这是一个修改查询。
问题是:为什么我们需要@Modifying
注释(连同@Transactional
一起)?也许我想念什么?
我知道像this或that这样的讨论,但是我没有明确解释为什么如果@Modifying
携带了所有需要的信息就必须使用@Transactional
。
最佳答案
从reference docs
默认情况下,存储库实例上的CRUD方法是事务性的。
对于读取操作,事务配置readOnly标志为
设置为true。其他所有配置为普通的@Transactional,因此
该默认交易配置适用。
和@Modifying回答了为什么我们为什么需要@Modifying注释?
指示应将查询方法视为将查询修改为
改变了它执行的方式。此注释仅
考虑是否用于通过查询定义的查询方法
注解)。它不适用于自定义实现方法或
从方法名称派生的查询,因为它们已经可以控制
基础数据访问API或指定它们是否正在被以下人员修改
他们的名字。
需要@Modifying
批注的查询包括INSERT,UPDATE,
DELETE和DDL语句。
also
@Modifying注释仅与
@Query注释。派生的查询方法或自定义方法不
需要此注释。
(与@Transactional一起)@Transactional
与@Modifying
一起不是必需的。只是用@Modifying
注释的方法应该在事务中执行。