Подтвердить что ты не робот

Как обрабатывать уникальные нарушения ограничений 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?
}
4b9b3361

Ответ 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.

И затем просмотрите информацию об исключении.