Spring @Transactional没有开始交易

时间:2015-02-24 12:44:28

标签: spring maven-3 spring-transactions

我有一个多模块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。包括以下课程:

@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存储库接口实现的类也会使用@Transactional注释。)

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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