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