Мой предпочтительный подход заключается в использовании JSR 303 (API проверки бинов), чтобы убедиться, что свойства класса действительны.
Это вполне нормально для проверки в установщиках, но это не всегда желательный подход. Существует возможность смешивания потребностей нескольких контекстов, которые не связаны друг с другом. Например, некоторые из ваших свойств никогда не должны устанавливаться из пользовательского интерфейса, а вместо этого будут вычисляться службой, прежде чем будут сохранены. В таком случае нежелательно иметь эту логику внутри установщика, поскольку вам необходимо знать контекст, в котором вызывается установщик; вам нужно будет применять разные правила на уровне пользовательского интерфейса и на уровне постоянства. JSR 303 позволяет вам разделить эти проблемы с помощью групп проверки, чтобы ваша группа проверки пользовательского интерфейса отличалась от вашей группы проверки постоянства.
В JPA 2.0, когда вы аннотируете свой класс с помощью ограничений, которые оцениваются валидатором JSR 303, ваш поставщик сохраняемости может автоматически оценивать эти ограничения на PrePersist
, PreUpdate
и PreRemove
(обычно это не делается; см. ниже) события жизненного цикла объектов. Чтобы выполнить проверку сущностей в вашем JPA-провайдере, вы должны указать либо элемент validation-mode
, либо свойство javax.persistence.validation.mode
в вашем файле persistence.xml
; значения должны быть либо AUTO
(по умолчанию), либо CALLBACK
(а не NONE
).
Наличие поставщика Bean Validation является достаточным для того, чтобы гарантировать, что проверка происходит в событиях жизненного цикла сущности JPA, поскольку значением по умолчанию является AUTO
. Вы получаете это по умолчанию на сервере приложений Java EE 6; Glassfish использует RI-реализацию JSR 303, которая является Hibernate Validator, и она также хорошо работает с EclipseLink.
Режим CALLBACK
позволит вам переопределить группы проверки, которые должны применяться при запуске событий жизненного цикла. По умолчанию группа проверки Bean по умолчанию (Default
) будет проверяться на наличие обновлений и постоянных событий; Событие удаления не требует проверки. Режим CALLBACK
позволяет вам указать другую группу проверки для этих событий, используя свойства javax.persistence.validation.group.pre-persist
, javax.persistence.validation.group.pre-update
и javax.persistence.validation.group.pre-remove
.
Имейте в виду, что проверку JSR 303 можно использовать вне контейнера Java EE, хотя ссылка на документацию по API Bean Validation, которую я разместил выше, взята из документации по API Java EE 6.