Spring @Transactional 未启动事务

Spring @Transactional not starting a transaction

我有一个多模块 Maven 项目,其结构如下:

project
  |
   -- data
       |
        -- DepartmentRepository.java
  |
   -- domain
       |
        -- Department.java
  |
   -- service
       |
        -- DepartmentService.java
       |
        -- DepartmentServiceImpl.java
  |
   -- web
       |
        -- DepartmentController.java

该项目使用 Spring 4.1.4,Spring Data JPA 1.7.2 和 Maven 3.1.0。包括以下 class 个:

@Entity class Department {}

interface DepartmentRepository extends JpaRepository<Department, Long> {}

interface DepartmentService {
  List<Department> getAll();
}

@Service
@Transactional(readOnly = true)
class DepartmentServiceImpl implements DepartmentService {
  @Autowired
  private DepartmentRepository departmentRepository;

  @Transactional
  public List<Department> getAll() {
    return departmentRepository.findAll();
  }
}

我希望一旦代码输入 DepartmentServiceImpl.getAll,交易就会开始。但是,我发现情况并非如此。没有交易开始。我通过检查此方法中的 TransactionSynchronizationManager.isActualTransactionActive() 来检查这一点,该方法打印 false。我还通过在 TransactionAspectSupport.invokeWithinTransaction 中放置断点进行了检查。但是,一旦 departmentRepository.findAll 被调用,事务就会正确启动(因为 SimpleJpaRepository,提供 JPA 存储库接口实现的 class 也被注释为 @Transactional ).

Github.

上提供了演示该问题的完整示例应用程序

我注意到你的 annotation-driven 模式设置为 aspectj

<transaction:annotation-driven mode="aspectj"/>

但您似乎没有在上下文中的任何地方定义 load-time-weaver

这可能是也可能不是问题,因为我只是快速浏览了一下。另外,我不明白为什么你需要 aspectj 而不是默认的 proxy 模式,所以你可能只需要完全删除 mode="aspectj" 并默认为代理。