Как перехватить исключения из фиксации транзакции, управляемой контейнером?

У меня есть @Stateless EJB с @WebService интерфейс, использующий управляемые контейнером транзакции, то есть транзакции автоматически фиксируются контейнером после вызова метода, если он не выдает системное исключение.

Если я попытаюсь EntityManager.persist(...) два объекта с одинаковым значением для столбца с уникальным ограничением, контейнер будет выбрасывать PersistenceException клиенту на коммит вне моего кода. Как мне поймать это исключение, чтобы я мог сбросить свое собственное исключение приложения?

Нужно ли фиксировать транзакцию вручную в моих методах, чтобы перехватывать исключения при фиксации? (И является EntityManager.flush() правильный способ сделать это?) Если так, какой смысл иметь управляемые контейнером транзакции?

1 ответ

Решение

К сожалению, невозможно отловить исключения из-за сбоя транзакции, управляемой контейнером. Как вы заявили, ваш лучший вариант - использовать управляемые бином транзакции. В качестве альтернативы вы можете обернуть свой EM EJB прокси-компонентом, который реализует тот же интерфейс. Управляемые контейнером транзакции подходят, когда вашему коду не нужно реагировать на конкретные сбои фиксации.

Другие вопросы по тегам