Как обрабатывать уникальные нарушения ограничений JPA?
При нарушении уникального ограничения генерируется a javax.persistence.RollbackException
. Но может быть несколько причин бросать RollbackException
. Как я могу узнать, что было нарушено уникальное ограничение?
try {
repository.save(article);
}
catch(javax.persistence.RollbackException e) {
// how to find out the reason for the rollback exception?
}
Ответы
Ответ 1
Как я могу узнать, что было нарушено уникальное ограничение?
Исключение прикомандировано, вы должны вызывать getCause()
рекурсивно, чтобы получить исключительное условие поставщика (и, возможно, перейти к SQLException
), чтобы перевести его на то, что приложение может прекрасно обрабатывать для вашего пользователя. Следующее выведет цепочку исключений:
for (t = e.getCause(); t != null; t = t.getCause()) {
logger.debug("Exception:" + t);
}
Для обработки исключений и "перевода" вы можете сделать что-то вроде того, что делает Spring (см. различные классы JpaDialect
, например HibernateJpaDialect
, чтобы получить представление).
Все это нехорошо, этот код не будет переносимым и найти, какие атрибуты, вызванные нарушением, будут непростыми. Это как-то подтверждает, что нет элегантного и портативного способа обработки нарушений ограничений в JPA.
Ответ 2
Используйте e.getCause()
, чтобы проверить, что вызвало откат.
Ответ 3
компилятор возвращает исключение SQLIntegrityConstraintViolationException при попытке нарушить уникальное ограничение.
Используйте следующую концепцию блока catch, чтобы обрабатывать правильные исключения.
catch(SQLIntegrityConstraintViolationException e)
{
// Error message for integrity constraint violation
}
catch(Exception e)
{
// Other error messages
}
Ответ 4
Я думаю, что печать трассировки стека поможет вам это узнать. e.printStackTrace();
Ответ 5
Вы можете сделать следующее:
StringWriter writer=new StringWriter(); //remains the message from stack trace.
e.printStackTrace(new PrintWriter(writer));
String message=writer.toString(); // gets the message of full stack trace.
И затем просмотрите информацию об исключении.