@Transactional не работает, когда я выкидываю исключение на следующей строке - PullRequest
0 голосов
/ 02 апреля 2020

Я не понимаю следующее поведение:

У меня есть метод:

@Transactional
public void processRejection(final Path path) {

    try {

        //some code here

    } catch (final Exception e) {
         this.handleException(e));
    }
 }

, который вызывает ниже, который делает saves сущность, которая еще не существует в базе данных:

void handleException(final Throwable e) {

    this.filesMonitoringJpaManager.save(someEntityHere);

    throw new Exception(...)
}

Теперь странно, когда я комментарий throw new Exception(...) save работает, но когда я раскомментирую throw new Exception(...) тогда save не работает, и я понятия не имею, почему?

Что за странное поведение в JPA или Hibernate? Это что-то про Java механизм исключения, который я не понимаю?

1 Ответ

1 голос
/ 02 апреля 2020

@Transactional предназначен для отката, когда что-то идет не так (исключение выдается). Вы сохраняете сущность в блоке catch, но повторно генерируете исключение, вызывающее откат транзакционного метода.

Но вы можете указать исключение, которое не вызовет откат:

@Transactional(noRollbackFor = {MyException.class})
public void processRejection(final Path path) {

    try {
        //somecode here whatever
    } catch (final Exception e) {
         this.handleException(e));
    }
 }

void handleException(final Throwable e) {
    this.filesMonitoringJpaManager.save(someEntityHere);
    throw new MyException(...)
}

Это работает для org.springframework.transaction.annotation.Transactional. Если вы используете javax.transaction.Transactional, то вы можете достичь этого, используя свойство dontRollbackOn.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...