У меня есть @Stateless
EJB с интерфейсом @WebService
, используя транзакции, управляемые контейнером, что означает, что транзакции автоматически фиксируются контейнером после вызова метода, если он не вызывает системного исключения.Как я могу перехватить исключения из транзакции, управляемой контейнером?
Если я пытаюсь установить EntityManager.persist(...)
два объекта с тем же значением для столбца с уникальным ограничением на него, контейнер будет выдавать клиенту PersistenceException
, чтобы он совершил вне моего кода. Как я могу уловить это исключение, поэтому я могу изменить свое собственное исключение приложения?
Должен ли я совершать транзакцию вручную в своих методах, чтобы перехватывать исключения при фиксации? (И есть EntityManager.flush()
правильный способ сделать это?) Если да, то в чем смысл транзакций, управляемых контейнером?
Благодарим вас за ответ. Я решил это, выполнив 'EntityManager.flush()' в перехватчике '@ AroundInvoke'. –
Это может работать иногда, но будьте осторожны с уровнями изоляции. Если вы не сериализуете все, все равно можно получить сбои, когда tx совершит. –