2010-09-16 6 views
5

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

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

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

ответ

3

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

+2

Благодарим вас за ответ. Я решил это, выполнив 'EntityManager.flush()' в перехватчике '@ AroundInvoke'. –

+1

Это может работать иногда, но будьте осторожны с уровнями изоляции. Если вы не сериализуете все, все равно можно получить сбои, когда tx совершит. –