JPA / Hibernate обработка исключений - PullRequest
7 голосов
/ 03 января 2012

Я использую JPA / Hibernate (новичок в них).Когда возникает исключение (может быть уникальным нарушением ограничения), я хочу перехватить его и показать некоторые сообщения о значении приложения вместо печати трассировки стека.

Предоставляет ли Hibernate какой-либо инструмент для получения информации (возможно, независимый от базы данных)об исключениях?

Ответы [ 5 ]

5 голосов
/ 03 января 2012

HibernateException инкапсулирует действительную основную причину , которая может предоставить вам достаточно информации для создания значимых удобных сообщений. Прочитайте раздел Обработка исключений в их документации.

3 голосов
/ 24 января 2014

Вы можете сделать следующее. я это сделал. Но, конечно же, вы используете специфический для поставщика код, поэтому, если вы выбираете другого провайдера JPS, вам придется изменить код в нескольких местах. В то же время, иногда это практично, когда вы знаете, что не будете легко менять провайдера JPA, а более удобное сообщение об ошибке более важно

try{
...
}

catch( javax.persistence.PersistenceException  ex)

{

     if(ex.getCause() instanceof org.hibernate.exception.ConstraintViolationException)

      {..........}

}
2 голосов
/ 29 января 2012

Вы можете поймать либо общее JDBCException:

try {
    userDao.save(user); //might throw exception
} catch(JDBCException e) {
    //Error during hibernate query
}

или вы также можете поймать один из более определенных подклассов JDBCException, например ConstraintViolationException или JDBCConnectionException:

try {
    userDao.save(user); //might throw exception
} catch(ConstraintViolationException e) {
    //Email Address already exists
} catch(JDBCConnectionException e) {
    //Lost the connection
}

и с помощью метода e.getCause() вы можете извлечь базовый SQLException и проанализировать его далее:

try {
    userDao.save(user); //might throw exception
} catch(JDBCException e) {
    SQLException cause = (SQLException) e.getCause();
    //evaluate cause and find out what was the problem
    System.out.println(cause.getMessage());
}

Который напечатал бы, например: Duplicate entry 'UserTestUsername' for key 'username'

1 голос
/ 03 января 2012

Вы можете специально поймать org.hibernate.exception.ConstraintViolationException.Таким образом, вы знаете, что ловите только проблемы с ограничениями.

0 голосов
/ 03 января 2012

Все исключения в Hibernate являются производными от класса Java RuntimeException.Поэтому, если вы поймаете RuntimeException в своем коде, вы можете извлечь причину исключения, вызвав методы класса исключений 'getCause () или getMessage ()

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