Как перехватить исключения из фиксации транзакции, управляемой контейнером?
У меня есть @Stateless
EJB с @WebService
интерфейс, использующий управляемые контейнером транзакции, то есть транзакции автоматически фиксируются контейнером после вызова метода, если он не выдает системное исключение.
Если я попытаюсь EntityManager.persist(...)
два объекта с одинаковым значением для столбца с уникальным ограничением, контейнер будет выбрасывать PersistenceException
клиенту на коммит вне моего кода. Как мне поймать это исключение, чтобы я мог сбросить свое собственное исключение приложения?
Нужно ли фиксировать транзакцию вручную в моих методах, чтобы перехватывать исключения при фиксации? (И является EntityManager.flush()
правильный способ сделать это?) Если так, какой смысл иметь управляемые контейнером транзакции?
1 ответ
К сожалению, невозможно отловить исключения из-за сбоя транзакции, управляемой контейнером. Как вы заявили, ваш лучший вариант - использовать управляемые бином транзакции. В качестве альтернативы вы можете обернуть свой EM EJB прокси-компонентом, который реализует тот же интерфейс. Управляемые контейнером транзакции подходят, когда вашему коду не нужно реагировать на конкретные сбои фиксации.