Любой метод управляемого бина Middleware можно пометить аннотацией @org.springframework.transaction.annotation.Transactional
, что вызовет автоматическое создание транзакции при вызове этого метода. В таком методе не нужно вызывать Persistence.createTransaction()
, а можно сразу получать EntityManager
и работать с ним.
Для аннотации @Transactional
можно указать параметры. Основным параметром является режим создания транзакции - Propagation
. Значение REQUIRED
соответствует getTransaction()
, значение REQUIRES_NEW
- createTransaction()
. По умолчанию REQUIRED
.
Декларативное управление транзакциями позволяет уменьшить количество boilerplate кода, однако имеет следующий недостаток: коммит транзакции происходит вне прикладного кода, что часто затрудняет отладку, т.к. скрывается момент отправки изменений в БД и перехода сущностей в состояние Detached. Кроме того, следует иметь в виду, что декларативная разметка сработает только в случае вызова метода контейнером, т.е. вызов транзакционного метода из другого метода того же самого объекта не приведет к старту транзакции.
В связи с этим рекомендуется применять декларативное управление транзакциями только для простых случаев типа метода сервиса, читающего некоторый объект и возвращающего его на клиента.