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
).
上提供了演示该问题的完整示例应用程序
我注意到你的 annotation-driven
模式设置为 aspectj
<transaction:annotation-driven mode="aspectj"/>
但您似乎没有在上下文中的任何地方定义 load-time-weaver
。
这可能是也可能不是问题,因为我只是快速浏览了一下。另外,我不明白为什么你需要 aspectj
而不是默认的 proxy
模式,所以你可能只需要完全删除 mode="aspectj"
并默认为代理。
我有一个多模块 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
).
我注意到你的 annotation-driven
模式设置为 aspectj
<transaction:annotation-driven mode="aspectj"/>
但您似乎没有在上下文中的任何地方定义 load-time-weaver
。
这可能是也可能不是问题,因为我只是快速浏览了一下。另外,我不明白为什么你需要 aspectj
而不是默认的 proxy
模式,所以你可能只需要完全删除 mode="aspectj"
并默认为代理。