Получение имени поля и таблицы, вызвавших исключение, из объекта исключения SQL.
Вопрос
В своем проекте я использую Hibernate JPA и Spring.Предположим, если я попытаюсь вставить запись с повторяющимся значением ключа, запрос на вставку выдаст исключение.
Теперь можно ли получить имя таблицы, имя поля и возможную причину исключения из объекта SQL Exception во время выполнения!?
Решение
Как уже упоминалось в других ответах, большую часть времени вы ограничены тем, что вам дает база данных. Однако в некоторых случаях Hibernate может сказать вам о проблеме - это будет не таблица и поле, а может быть сущность и свойство
Например, если вы пытаетесь поместить слишком большое значение в столбец, вы можете использовать это:
try {
entityManager.persist(object);
} catch (InvalidStateException e) {
log.info("Caught Hibernate exception: #0", e.getClass().getName());
InvalidValue[] invalidValues = e.getInvalidValues();
for(InvalidValue invalidValue : invalidValues) {
log.info("Invalid Property #0 has value: #1", invalidValue.getPropertyName(), invalidValue.getPropertyName());
}
}
Другие советы
SQLExceptions, как правило, просто оборачивают ошибки базы данных, вы можете получить такую информацию, только если она была включена в ошибку, которую выдала ваша база данных.По моему опыту отладки Hibernate и JDBC, я бы рискнул сказать, что ответ на этот вопрос, как правило, «нет», но могут быть и исключения.
hibernate оборачивает SQLException как JDBCException и пытается преобразовать его в более значимое полное исключение, такое как ConstraintViolationException, используя SQLExceptionConverter, который присоединен к SessionFactory.
SQLException sqlException = ((JDBCException)ex).getSQLException();