Обработка исключений с помощью JPA + Hibernate

Я использую JPA с Hibernate в качестве провайдера с транзакциями, управляемыми контейнером (JBoss AS 6.1.0.Final).

Я пытаюсь реализовать детальную обработку исключений, потому что у меня есть определенная иерархия исключений в моем приложении, поэтому я могу определить, что делать в каждой ситуации. Итак, я исследовал в течение нескольких часов и нашел документацию расплывчатой, а примеры несколько сырыми, потому что обработка исключений всегда опускается «ради ясности» или представляет собой простой блок try-catch, который обрабатывает Exception e.

Возьмем, к примеру, такой код:

public void deleteCompany(ICompany company) throws MyException1, MyException2 {
    if(entityManager != null){
        if(company !=null) {
            try {
                ICompany companyReference= entityManager.getReference(Company.class, company.getId());
                entityManager.remove(managedCompany);
                entityManager.flush();
            } catch(EntityNotFoundException companyDoesNotExist) {
                //Wrap & Throw
            }
        } else {
        throw new MyException1("An error occurred while attempting to save a null instance of a company");
        }
    } else {
        throw new MyException2("The entity manager instance is null");
    }   
}

Блок catch пуст, потому что здесь я застрял... Я не знаю, какое исключение я должен перехватить, чтобы предупредить систему о том, что пользователь пытается удалить блок. несуществующая запись.

Мой конкретный вопрос: могу ли я перехватывать исключения Hibernate в этом блоке перехвата или я должен перехватывать исключения JPA? Я нашел несколько источников, в которых утверждается, что JPA оборачивает исключения провайдеров, но мне это кажется странным. Я также обнаружил, что вызов метода flush() позволяет перехватывать исключения доступа к базе данных и манипулирования ими, поскольку транзакциями управляет контейнер, и, таким образом, обязательство происходит на дальнейших этапах после вызова deleteCompany.

Спасибо.

РЕДАКТИРОВАТЬ:Я оборачиваю исключения, которые я ловлю, своими собственными исключениями, аннотированными с помощью @ApplicationException(rollback=true), поэтому я могу снова их генерировать и обрабатывать их более четко.

РЕДАКТИРОВАТЬ 2:Я обновил свой код. Слияние перед удалением сохраняет компанию, если ее нет в базе данных, что приводит к успешному удалению каждый раз. Теперь исключения выбрасываются, и я проверяю, как он ведет себя в разных ситуациях, перехватывая исключения JPA, как это было предложено Perception.

РЕДАКТИРОВАТЬ 3:Теперь это работает! Оказывается, ошибка была частично в моем коде из-за этого вызова слияния. Получение ссылки сначала и попытка удаления после делает трюк, таким образом, я смог поймать EntityNotFoundException, обернуть его и снова бросить.

5
задан Fritz 18 April 2012 в 13:40
поделиться