2015-02-24 4 views
0

У меня Maven проект с мульти-модуль со следующей структурой:Пружина @Transactional не начинает транзакцию

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

Проект использует Spring 4.1.4, весна данных 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

я заметил ваш режим annotation-driven установлен в aspectj

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

, но вы, кажется, не имеют load-time-weaver определены в любом месте в вашем контексте.

Это может быть или не быть проблемой, поскольку я только быстро посмотрел. Кроме того, я не понимаю, почему вам понадобится aspectj по сравнению с режимом proxy по умолчанию с тем, что у вас есть, поэтому вы можете просто удалить mode="aspectj" вообще и по умолчанию прокси.

+0

Я изменил '' to '' в примере приложения, чтобы заставить транзакции работать. – manish

Смежные вопросы