2013-09-09 5 views
0

Я использую EclipseLink 2.5 с JPA 2.1 в автономном приложении Java.Проверка данных JPA2 подробное ведение журнала

Некоторое поле помечено знаком @Basic (необязательно = false), но даже с нулевым значением я не получил никаких ошибок перед фиксацией. Ограничение установлено в базе данных, поэтому я получил исключение JDBC.

Добавление Hibernate Validator к проекту и настройке режима проверки для обратного вызова не помогло.

Только с @NotNull аннотация на поле У меня есть исключение: javax.validation.ConstraintViolationException: Bean Validation constraint(s) violated while executing Automatic Bean Validation on callback event:'prePersist'. Please refer to embedded ConstraintViolations for details., который не очень специфичен и не сообщает, где проблема.

Я хотел бы знать, есть ли способ сделать это сообщение более надежным: например, имя поля не задано или что-то в этом роде, и заставьте eclipselink проверить optional = false.

EDIT: Я знаю разницу между JPA и проверкой Bean. Я пытаюсь выполнить проверку только с помощью JPA, используя параметр optional = false. Насколько мне известно (@Basic(optional = false) vs @Column(nullable = false) in JPA), @Basic (необязательно = false) следует проверять во время выполнения, а @Column (nullable = false) следует использовать для того, чтобы сделать столбцом неизменяемым в базе данных.

Я ищу способ отображения нарушений с отсутствием уловов ConstraintViolations во всем мире.

ответ

1

Несколько вещей здесь. Сначала вы должны различать JPA и Bean Validation. Две разные спецификации и многое другое. @Basic - аннотация JPA, тогда как @NotNull - аннотация для проверки бина. Используя @Basic (необязательно = false) в сочетании с созданием схемы, вы действительно получите ограничение базы данных, которое, в свою очередь, приведет к исключению JDBC во время сохранения.

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

+0

Я знаю разницу между JPA и проверкой Bean. Я пытаюсь выполнить проверку только с помощью JPA, используя параметр optional = false. –

0

Я ищу способ отображения нарушений с отсутствующим улавливанием ConstraintViolations во всем мире.

Вы можете добавить catch(ConstraintViolationException cve) {...} блок на внешнем уровне вашего кода приложения (например, в виде некоторого запроса обработчика/перехватчика в случае, если это веб-приложение) и использовать его для обработки нарушений ограничений в общем виде. Объект ConstraintViolation предоставляет много информации, такой как название заинтересованного имущества и т. Д. Я не уверен, хотя почему EclipseLink не учитывает @Basic(optional=false).

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