Откат транзакции после исключения в JPA + Spring - PullRequest
4 голосов
/ 22 февраля 2011

Я использую Spring и JPA с HIbernate внизу.Когда создается исключение PersistenceException, я хочу перехватить его и вернуть сообщение об ошибке, чтобы оно не было передано вызывающей стороне.

@Transactional
public String save(Object bean) {
    String error = null;

    try {
        EntityManager entityManager = getEntityManager();

        for (int i = 0, n = entities.size(); i < n; i ++) {
            entityManager.merge(entities.get(i));
        }
    }
    catch (PersistenceException e) {
        error = e.getMessage();
    }

    return error;
}

Но я получаю исключение о том, что javax.persistence.RollbackException: Transaction marked as rollbackOnly. Я получаю, чтотранзакция должна быть откатана после исключения, но как мне откатить ее, когда я перехватил исключение и не хочу перебрасывать его?

Ответы [ 4 ]

5 голосов
/ 23 февраля 2011

Вы можете использовать Spring * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *1002* * * *

О, кстати, вы не должны использовать @Transactional на уровне DAO. Транзакции следует начинать на уровне обслуживания.

4 голосов
/ 22 февраля 2011

Используя @ Transactional , если в методе есть какие-либо исключения RuntimeException, он автоматически выполнит откат. Вам не нужно делать это вручную. Вероятно, вам вообще не нужно перехватывать это исключение, а вместо этого позволить ему перейти на ExceptionHandler более высокого уровня, который показывает пользователю некоторую стандартную страницу ошибки (а не трассировку стека). Также ваш метод помечен как void, но вы возвращаете строку.

2 голосов
/ 26 февраля 2011

Похоже, что откат неудачной транзакции, управляемой Spring ORM, невозможен.Код, указанный в вопросе, является классом обслуживания.Извлечение подпрограммы персистентности в отдельный класс DAO и получение дескриптора класса обслуживания PersistenceExceptions сделали свое дело.

0 голосов
/ 22 февраля 2011

Используйте @Transactional(noRollbackFor={PersistenceException.class}) для метода, который вызывает исключение.

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