Исключение распространяется после того, как оно уже обнаружено

У меня происходит самая странная вещь, и я могу » Я понимаю, почему. Лучший способ описать это - предоставить упрощенный пример:

@Service
@Transactional
public class Foo{
    public ModelAndView delete(@ModelAttribute("abc") Long id) {
        ModelAndView mav = new ModelAndView();
        try {
            getDaoService().delete(id); //Calls Bar.delete()
        } catch (final Exception e) {
            // Add a custom error message to the mav for the user to see
            mav.getModelMap().addAttribute(blah, blah);
        }
        return mav;
    }
}

@Service
@Transactional
public class Bar {
    public void delete(final E entity) throws HibernateException {
        if (null != entity) {
            try {
                sessionFactory.getCurrentSession().delete(entity);
            } finally {
                sessionFactory.getCurrentSession().flush();
            }
        }
    }
}

В этом конкретном случае я пытаюсь удалить объект, у которого есть нарушение ограничения (ORA-02292). Я ожидаю, что удаление не удастся из-за этого. Когда удаление не удается, я хочу показать пользователю соответствующее настраиваемое сообщение.

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

org.springframework.transaction.UnexpectedRollbackException: транзакция откатилась, потому что она была помечена только для отката

Когда я использую отладчик, я вижу, что ошибка правильно обнаружена и что объект ModelAndView имеет внутри себя настраиваемое сообщение. Итак, я понятия не имею, почему исключение все еще генерируется после того, как оно было поймано и обработано. Кто-нибудь знает, почему это происходит?

7
задан Cœur 11 October 2018 в 03:16
поделиться