Мое приложение Spring состоит из Bean, Service и DAO. Все аннотации @Transactional находятся на сервисном уровне.
Это псевдокод в одном конкретном сценарии.
UserBean.java
saveUser() {
userService.manageUser();
}
UserServiceImpl.java
@Transactional
public void manageUser() {
userDAO.createUser();
userDAO.updateParentUser();
}
UserDAOImpl.java
createUser() {
//insert user record in database
}
updateParentUser() {
//update parent user's database record
}
В моем тестовом примере сохранения пользователя операция обновления родительского пользователя может завершиться ошибкой в некоторых случаях из-за нарушения первичного ключа, что вполне ожидаемо.
Поскольку аннотация @Transactional реализована в классе обслуживания, это исключение нарушения будет уведомлено только в классе компонента.
Как можно получить это уведомление о нарушении PK в моем классе обслуживания? [Тогда я могу обработать это оттуда в другом бизнес-процессе.]
Если я добавлю новый метод в класс обслуживания и вызову manageUser() оттуда, аннотация @Transactional не будет работать должным образом. Это связано с ограничением/свойством АОП. Spring ожидает внешний вызов методов @Transactional.