【问题标题】:Why do I have to use @Modifying with @Transactional in spring data jpa?为什么我必须在 spring data jpa 中使用 @Modifying 和 @Transactional?
【发布时间】:2020-06-05 06:22:52
【问题描述】:

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

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

问题是:为什么我们需要@Modifying 注释(连同@Transactional)? 也许我错过了什么?

我知道thisthat 之类的讨论,但如果@Transactional 包含所有需要的信息,为什么必须使用@Modifying,我没有明确解释。

【问题讨论】:

    标签: java spring spring-data-jpa


    【解决方案1】:

    来自reference docs

    默认情况下,存储库实例上的 CRUD 方法是事务性的。 对于读操作,事务配置 readOnly 标志为 设置为真。所有其他人都配置了一个普通的 @Transactional 所以 该默认事务配置适用。

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

    表示一个查询方法应该被认为是修改查询为 这改变了它需要执行的方式。 此注释仅 如果用于通过 Query 定义的查询方法,则考虑 注解)。它不适用于自定义实现方法或 从方法名称派生的查询,因为它们已经可以控制 底层数据访问 API 或指定它们是否正在修改 他们的名字。

    需要@Modifying 注释的查询包括 INSERT、UPDATE、 DELETE 和 DDL 语句。

    also

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

    (连同@Transactional)

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

    【讨论】:

    • "@Transactional(readOnly=true) 可以调用带有 @Modifying" 注释的存储库方法" 据我所知,仅在不支持读取的数据源上-only 事务,否则执行将失败。
    • @MarkRotteveel 我承认我不知道这一点。我在内存中的 h2 数据库上对此进行了测试。如果示例是错误的,我将编辑它
    • 谢谢。我会修改答案
    猜你喜欢
    • 2021-12-24
    • 2017-09-25
    • 2022-10-16
    • 2018-06-27
    • 2018-06-27
    • 2016-10-04
    • 2020-09-17
    • 1970-01-01
    • 2018-01-26
    相关资源
    最近更新 更多