OPENJPA:: как фиксировать объекты при вызове исключения

Пусть все http заменят https, потому что правильными источниками какао-пакетов являются https://ruby.taobao.org/

0
задан avish 13 July 2018 в 06:21
поделиться

2 ответа

Спецификация EJB 3.1 spec описывает, как вы можете это сделать в разделе 14.2.1:

Поставщик Bean определяет исключения приложений. Исключения приложений, которые являются проверенными исключениями, могут быть определены как таковые, поскольку они перечислены в предложениях бросков методов бизнес-интерфейса bean, вид без интерфейса, домашний интерфейс, компонентный интерфейс и конечная точка веб-сервиса. Исключение приложения, которое является неконтролируемым исключением, определяется как исключение приложения, аннотируя его аннотацией метаданных ApplicationException или обозначая его в дескрипторе развертывания с помощью элемента исключений приложения

и

Исключение приложения автоматически не приводит к маркировке транзакции для отката, если аннотация ApplicationException не применяется к классу исключений и указана с помощью значения элемента rollback true или элемента описания развертывания исключения приложения для exception указывает элемент отката как истинный. [...]

Поставщик Bean должен выполнить одно из следующих действий для обеспечения целостности данных перед тем, как выбросить исключение приложения из экземпляра корпоративного компонента:

  • Убедитесь, что экземпляр находится в состоянии, так что попытка клиента продолжить и / или совершить транзакцию не приведет к потере целостности данных. Например, экземпляр вызывает исключение приложения, указывающее, что значение входного параметра было недопустимым до того, как экземпляр выполнил какие-либо обновления базы данных.
  • Если исключение приложения не указано, чтобы вызвать откат транзакции, отметьте транзакцию для отката с помощью метода EJBContext.setRollbackOnly перед выбросом исключения приложения. Маркировка транзакции для отката гарантирует, что транзакция никогда не сможет зафиксировать.

То есть, если вы хотите, чтобы транзакция была зафиксирована при вызове исключения, вы должны указать это исключение как исключение приложения .

Или вы можете начать отдельную транзакцию, но поскольку JEE не поддерживает вложенные транзакции, это возможно только после завершения предыдущей транзакции.

0
ответ дан meriton 17 August 2018 в 13:35
поделиться
  • 1
    Спасибо Меритону. У меня создалось впечатление, что вышеупомянутый вариант возможен только с проверенным исключением, которое мы не хотели иметь в коде. Я попробую непроверенное исключение приложения. – avish 13 July 2018 в 07:12
  • 2
    Этот ответ помог. Благодаря!! – avish 13 July 2018 в 13:41

Оберните этот бит в

boolean itWorked = true;
try {
   // .. persistence operation which throws exception
} catch (YourFavouriteException yfe) {
  itWorked = false;
}
if (!itWorked) {
  // try it again (the definition of insanity)
}

Убедитесь, что вы не перехватываете общие исключения, но получаете только свое конкретное исключение (которое по какой-то причине означает, что сохранение все еще действует)

0
ответ дан Rick 17 August 2018 в 13:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: