Вопрос

У меня есть метод EJB @Stouless, в котором я

  1. Удалите несколько записей из базы данных с помощью JPA remove()С.
  2. бросить исключение, которое аннотировано как @ApplicationException(rollback=true)

У меня нет других конкретных аннотаций с транзакциями для метода (я установил @TransactionAttribute(TransactionAttributeType.REQUIRED) Но это должно быть по умолчанию в любом случае!). Снареженные транзакции управляются контейнера. JPA поставщик EclipseLink.

И все же транзакция не откатывается, когда исключение брошено. Например. Записи, которые я удалял из базы данных до отката, не вернется. Кстати. Я звоню EntityManager .flush () До броска, может ли он вызывать такое поведение (не должно)?

Я также пытался позвонить SessionContext.setRollbackOnly(), с тем же результатом.

Как я могу отладить эту проблему?

Я использую GlassFish V3 и NetBeans для отладки, но я был бы одинаково рад с PrintLn, я просто не знаю, где их поставить ...

Это было полезно?

Решение

У меня есть метод EJB @Stouless, в котором я (...)

Просто чтобы уточнить, как вы получаете EntityManager?

(...) Я устанавливаю @transactaTttribute (транзацияattributeType.required

Действительно, это значение по умолчанию и в любом случае не должно потребоваться.

И все же транзакция не откатывается, когда исключение брошено. Например. Записи, которые я удалял из базы данных до отката, не вернется.

Хм, это очень странно и неожиданно.

Кстати. Я звоню EntityManager .flush () До броска, может ли он вызывать такое поведение (не должно)?

Нет, Flush! = Commun

Я также пытался вызвать SessionContext.Setrollbackonly (), с тем же результатом.

Ну, все еще неожиданно (но, по крайней мере, последовательно ...).

Я использую Glassfish V3 и NetBeans для отладки

Может быть, активируйте ведение журнала следующих категорий (например, через консоль администратора в разделе «Конфигурация> Регистрация> Уровни журнала), чтобы увидеть, если вы можете обнаружить что-то странное:

  • javax.enterprise.system.core.transaction.
  • javax.enterprise.resource.jta.
  • javax.enterprise.system.container.ejb.

В качестве альтернативы (вроде «лесозаготовка бедного человека») вы могли бы реализовать SessionSynchronization Чтобы получить уведомление о транзакции.

Действительно странная проблема ...

Смотрите также

Другие советы

В дополнение к хорошему ответу Паскаля, некоторые вещи, чтобы проверить ... ваш EntityManager гарантируется нет Для участия в контейнерных транзакциях, если какое-либо из следующих действий:

  • Вы создали EntityManager через EntityManagerFactory
  • Вы указали transaction-type="RESOURCE_LOCAL" В вашем сохранении .xml.

Вторичные вещи, чтобы проверить:

  • <jta-data-source> заполняется в сохранении .xml
  • DataSource ссылается через <jta-data-source> Настройка для участия в JTA транзакции (автоматическое коммиссия выключено)

Эти последние два являются несколько поставщиком, особенно в том, что некоторые поставщики автоматически заполнят <jta-data-source> Если это не указано. Также некоторые не пройдут развертывание, если <jta-data-source> Указывает на источник данных, который не установлен для участия в JTA транзакциях (эта настройка является специфичной поставщиком). Не уверены, как Glassfish обрабатывает эти два предмета.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top