2015-02-04 3 views
0

Рассмотрим гипотетический User таблицу:Обработка кодов ошибок Hibernate?

-- postgres, but it could have been any other SQL database 
CREATE TABLE User(
    id SERIAL PRIMARY KEY, 
    mail VARCHAR(32) UNIQUE NOT NULL 
); 

Давайте предположим, что я пытаюсь добавить двух пользователей с той же почтой:

session.save(new User(1, "[email protected]")); 
session.save(new User(2, "[email protected]")); 

и выполнить его через Hibernate. Hibernate бросит мне ConstraintViolationException:

Exception in thread "main" org.hibernate.exception.ConstraintViolationException: could not execute statement 
    at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:129) 

...

Caused by: org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "users_mail_key" 
    Detail: Key (mail)=([email protected]) already exists. 
     at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2198) 
    ... 

То, что я хотел бы знать, если есть какой-то хороший способ, кроме того, чтобы вручную разобрать выходной текст, за исключением, в к соберите причину ошибки, чтобы я мог правильно интерпретировать и реагировать на проблему.

Я понимаю, что на самом деле это может быть скорее проблема драйвера Postgres, чем на самом деле Hibernate, но я не уверен на этом этапе, поэтому я подумал, что может быть удобно спросить в контексте Hibernate.

+0

Можете ли вы проверить тип исключения (ConstraintViolationException)? Предоставляет ли это достаточную информацию для вас? – STLDeveloper

+0

я сделал. Из того, что я собрал, даже во внутреннем исключении, ничего полезного не найдено. Вот почему я сказал, что, может быть, проблема может заключаться в том, что драйвер Postgres не может быть очень информационным. Возможно, с другими драйверами для других БД этого не происходит. –

+0

Что он возвращает, если вы вызываете getErrorCode и getSQLState для этого исключения из Postgresql Driver? –

ответ

1

Так что, если вы можете получить значение из getSQLState, вы можете обращаться исключение:

«Все сообщения, отправленные сервером PostgreSQL, присваиваются пятисимвольным кодам ошибок, которые соответствуют соглашениям стандарта SQL для кодов« SQLSTATE ». Приложения, которые должны знать, какое условие ошибки произошло, обычно должны тестировать код ошибки, а не глядя на сообщение об ошибке текстуальное «

От:. http://www.postgresql.org/docs/9.3/static/errcodes-appendix.html

23505 = unique_violation

Примечание: В этой ссылке есть и список.

0

Ну, посмотрев исходный код драйвера Postgres, похоже, проблема связана с Postgres, а не с Hibernate. PSQLException будет содержать некоторую информацию, хотя это, конечно, не так отполированы, как я первый предполагалось :(

} catch (PSQLException e) { 
     ServerErrorMessage m = e.getServerErrorMessage(); 
     System.out.println(m.getColumn()); 
     System.out.println(m.getConstraint()); 
     System.out.println(m.getDatatype()); 
     System.out.println(m.getDetail()); 
     System.out.println(m.getFile()); 
     System.out.println(m.getHint()); 
     System.out.println(m.getInternalPosition()); 
     System.out.println(m.getInternalQuery()); 
     System.out.println(m.getLine()); 
     System.out.println(m.getMessage()); 
     System.out.println(m.getPosition()); 
     System.out.println(m.getRoutine()); 
     System.out.println(m.getSchema()); 
     System.out.println(m.getSeverity()); 
     System.out.println(m.getSQLState()); 
     System.out.println(m.getTable()); 
     System.out.println(m.getWhere()); 
    } 

печатает

null 
users_mail_key 
null 
Key (mail)=([email protected]) already exists. 
nbtinsert.c 
null 
0 
null 
398 
duplicate key value violates unique constraint "users_mail_key" 
0 
_bt_check_unique 
public 
ERROR 
23505 
users 
null 
+0

Значит, вы можете узнать об ошибке. Проверьте мой ответ. –

Смежные вопросы