无法对 Spring 数据 CRUD 方法执行 Propagation.MANDATORY
Unable to enforce Propagation.MANDATORY on Spring Data CRUD methods
有什么原因吗?
多年来我一直在使用 Spring 数据,但我认为我以前从未对他们开箱即用的 CRUD 方法之一进行过单元测试。
为什么下面的接口定义对其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 数据 CRUD 方法没有影响标记为 @Transactional
。当在这些接口上指定时,我一直认为它也是一个覆盖。
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);
}
}
希望这对您有所帮助
有什么原因吗?
多年来我一直在使用 Spring 数据,但我认为我以前从未对他们开箱即用的 CRUD 方法之一进行过单元测试。
为什么下面的接口定义对其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 数据 CRUD 方法没有影响标记为 @Transactional
。当在这些接口上指定时,我一直认为它也是一个覆盖。
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);
}
}
希望这对您有所帮助