首页 > 解决方案 > SpringBoot @Transactional 的翻译

问题描述

在我的代码中,我有一个带有updatePerson(Age age, Address address). 正在从 3 个不同的控制器调用此方法。现在由于控制器 1 中的一些要求,我不得不将一个附加字段作为updatePerson(Age age, Address address, Experience experience).

为了避免传入updatePerson(Age age, Address address, null)其他 2 个控制器,我想在我的界面中将此方法转换为默认方法,并在内部调用其他方法。所以我的界面现在看起来像:

public interface PersonService
{
   default PersonDO updatePerson(Age age, Address address) {
     return updatePerson(Age age, Address address, null);
   }

   PersonDO updatePerson(Age age, Address address, Experience experience);
}

现在的问题是:在这个接口的实现中,原来updatePerson的注释是@Transactional. 我知道如果一个普通的方法调用一个用 注释的方法@Transactional,事务就不能工作,因为它是由 spring 处理的。

所以在现在的实现中,我updatePerson(Age age, Address address, Experience experience)用@Transactional 进行了注释。

直接调用的控制器updatePerson(Age age, Address address, Experience experience),执行将发生在一个事务中。但是我不确定当控制器调用它default updatePerson(Age age, Address address)并且它在内部调用实现的方法时会发生什么?执行是否仍然发生在事务中?

标签: javaspringspring-boottransactions

解决方案


您可以添加@Transactional到默认方法,因此它也将在事务内部

@Transactional    
default PersonDO updatePerson(Age age, Address address) {
  return updatePerson(Age age, Address address, null);
}

推荐阅读