java - 无法在 Spring Data CRUD 方法上强制执行 Propagation.MANDATORY

标签 java spring spring-data transactional propagation

这有什么原因吗?

我多年来一直使用 Spring 数据,但我认为我以前从未对他们的开箱即用的 CRUD 方法之一进行过单元测试。

为什么以下接口(interface)定义对其 CRUD 方法的事务实现没有影响?

@Repository
@Transactional(propagation = Propagation.MANDATORY)
public interface MyRepository extends JpaRepository<MyEntity, Long> {

    Stream<MyEntity> findMyEntityByStatusEquals(Status status);
}

如果我从测试方法调用myRepository.save(new MyEntity()),而没有将我的测试包装在事务中,则它会成功。

但是,如果我调用 myRepository.findMyEntityByStatusEquals("MY_STATUS") 它会失败,表明它需要包装在事务中。

我期望后一种情况,前一种情况让我感到害怕,因为我似乎无法强制它成为现有交易的一部分。

::Edit:: 事实证明,将 @Transactional 放在界面顶部对之前标记为 的 Spring Data CRUD 方法没有影响@事务性。我一直认为在这些接口(interface)上指定时它也是一个覆盖。

最佳答案

正如documentation here所述

CRUD methods on repository instances are transactional by default. For reading operations the transaction configuration readOnly flag is set to true, all others are configured with a plain @Transactional so that default transaction configuration applies.

@Transactional 将 Propagation.REQUIRED 作为其默认传播类型,因此当您调用 save 方法时,新事务就开始了。

如果你想强制 Propagation.MANDATORY 甚至在内置 CRUD 方法上,你必须重写这些方法,即

@Repository
@Transactional(propagation = Propagation.MANDATORY)
public interface MyRepository extends JpaRepository<MyEntity, Long> {

    Stream<MyEntity> findMyEntityByStatusEquals(Status status);

    @Transactional(propagation = Propagation.MANDATORY)
    public <MyEntity> MyEntity save(MyEntity entity) {
      super.save(entity);
    }
}

希望这有帮助

关于java - 无法在 Spring Data CRUD 方法上强制执行 Propagation.MANDATORY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47655436/

相关文章:

java - 应用程序在 1 小时后失去当前 Activity

java - 在Android上的注释中使用XmlPullParser

java - Spring属性占位符配置需要在运行时动态替换

java - Play 框架 2 (Java) 表单数据绑定(bind)与嵌套允许字段

java - 如何使 Hibernate @Lock 注释适用于 Oracle DB?

java - 如何在 Spring Boot 应用程序中使用 JPQL 配置 JPA - "can' t 解析符号..”

java - Play 框架 Java Rest API 示例

java - 从服务中检索的日期格式

spring - 与一对多 Spring Data JPA 相加

java - 如何扩展 Spring Web 服务?