Глава 22. Дополнительные модули
Оглавление-
22.1. Проверка бинов (Bean Validation)
- 22.1.1. Добавление Проверки бинов (Bean Validation)
- 22.1.2. Конфигурация
- 22.1.3. Перехват нарушений
- 22.1.4. Схема базы данных
-
22.2. Поиск Hibernate (Hibernate Search)
- 22.2.1. Описание
- 22.2.2. Интеграция с аннотациями Hibernate
Hibernate Core также предлагает интеграцию с некоторыми внешними модулями/проектами. Hibernate Validator включает эталонную реализацию проверки бинов (JSR 303) и Поиск Hibernate.
22.1. Проверка бинов (Bean Validation)
Проверка бинов стандартизирует, как определять и объявлять ограничения уровня модели домена. Вы можете, например, выразить, что свойство никогда не должно быть null. Например: баланс счёта должен быть строго положительным и т. д. Эти ограничения модели домена объявляются в самом компоненте, аннотируя его свойства. Проверка Бина может затем прочитать их и проверить нарушения ограничений. Механизм проверки может быть выполнен в разных слоях вашего приложения без необходимости дублирования любого из этих правил (уровень представления, уровень доступа к данным). Следуя принципу DRY, для этой цели была разработана проверка бина и эталонная реализация Hibernate Validator.
Интеграция между Hibernate и Bean Validation работает на двух уровнях. Во-первых, она способна проверять экземпляры класса в памяти на нарушение ограничений. Во-вторых, она может применить ограничения к метамодели Hibernate и включить их в сгенерированную схему базы данных.
Каждая аннотация ограничения (constraint) связана с реализацией валидатора, ответственной за проверку ограничения в экземпляре сущности. Валидатор может также (необязательно) применить ограничение к метамодели Hibernate, позволяя Hibernate генерировать DDL, который выражает ограничение. С помощью соответствующего слушивателя событий вы можете выполнить операцию проверки на вставках, обновлениях и удалениях, выполняемых Hibernate.
При проверки экземпляров во время выполнения Hibernate Validator возвращает информацию о нарушениях
ограничений в наборе ConstraintViolations
. Среди прочей информации,
ConstraintViolation
содержит сообщение об ошибке, которое может вставлять набор значений
параметров с аннотацией (например, ограничение размера) и строки сообщения,
которые могут быть использованы для выделения ресурсов ResourceBundle
.
22.1.1. Добавление Проверки бинов
Чтобы включить интеграцию с проверкой Bean Validation, просто добавьте провайдера проверки Bean (предпочтительно Hibernate Validation 4) в ваш classpath.
22.1.2. Конфигурация
По умолчанию конфигурация не требуется.
Группа Default
проверяется на вставке и обновлении сущности, и соответственно
обновляется модель базы данных на основе группы Default
.
Вы можете настроить интеграцию проверки бина, установив режим проверки. Используйте свойство
javax.persistence.validation.mode
и настройте его, например, в файле
persistence.xml
или в файле hibernate.cfg.xml
. Возможны несколько вариантов:
-
auto
(по умолчанию): включить интеграцию между Bean Validation и Hibernate (обратный вызов и генерация ddl) только в том случае, если проверка бина присутствует в classpath. -
none
: отключить всю интеграцию между Bean Validation и Hibernate. -
callback
: только проверять объекты, когда они вставлены, обновлены или удалены. Исключение возникает, если в пути к классам не обнаружено ни одного поставщика Bean Validation. -
ddl
: только применяет ограничения к схеме базы данных при генерации Hibernate. Исключение возникает, если в пути к классам не обнаружено ни одного поставщика Bean Validation. Это значение не определяется спецификацией Java Persistence и специфично для Hibernate.
Заметка
Вы можете использовать и callback
, и ddl
вместе,
установив свойство для обратного callback, dll
<persistence ...> <persistence-unit ...> ... <properties> <property name="javax.persistence.validation.mode" value="callback, ddl" /> </properties> </persistence-unit> </persistence>
Это эквивалентно auto
, за исключением того, что, если отсутствует
поставщик Bean Validation, возникает исключение.
Если вы хотите проверить разные группы во время установки, обновления и удаления, используйте:
-
javax.persistence.validation.group.pre-persist
: группы, проверенные, когда сущность будет сохранена (по умолчанию используется значениеDefault
) -
javax.persistence.validation.group.pre-update
: группы подтверждены при обновлении объекта (по умолчанию используется значениеDefault
) -
javax.persistence.validation.group.pre-remove
: группы проверены, когда объект должен быть удален (по умолчанию используется значениеno group
) -
org.hibernate.validator.group.ddl
: группы, которые рассматриваются при применении ограничений на схему базы данных (по умолчанию используется значениеDefault
)
Каждое свойство принимает полностью квалифицированные имена классов проверяемых групп, разделенных запятой (,)
Пример 22.1. Использование настраиваемых групп для проверки
<persistence ...> <persistence-unit ...> ... <properties> <property name="javax.persistence.validation.group.pre-update" value="javax.validation.group.Default, com.acme.group.Strict" /> <property name="javax.persistence.validation.group.pre-remove" value="com.acme.group.OnDelete" /> <property name="org.hibernate.validator.group.ddl" value="com.acme.group.DDL" /> </properties> </persistence-unit> </persistence>
Заметка
Вы можете установить эти свойства в файлах hibernate.cfg.xml
,
hibernate.properties
или программно.
22.1.3. Перехват нарушений
Если сущность признана недействительной, список нарушений ограничений распространяется посредством исключения
ConstraintViolationException
, которое предоставляет набор ConstraintViolations
.
Это исключение обёрнуто в исключение RollbackException
, когда нарушение происходит
во время фиксации (commit). В противном случае возвращается ConstraintViolationException
(например, при вызове flush()
. Обратите внимание, что в целом уязвимые нарушения проверяются
на более высоком уровне (например, в Seam/JSF 2 с помощью интеграции JSF - Bean
Validation или на вашем бизнес-уровне, явно вызывая Bean Validation).
Код приложения редко ищет исключение ConstraintViolationException
, возбуждённое Hibernate.
Это исключение должно рассматриваться как фатальное, а контекст персистентности должен быть отброшен
(EntityManager
или Session
).
22.1.4. Схема базы данных
Hibernate использует ограничения Bean Validation для создания точной схемы базы данных:
-
@NotNull
приводит к непустому столбцу (если он не конфликтует с компонентами или наследованием таблицы) -
@Size.max
приводит к определениюvarchar(max)
для строк (String) -
@Min, @Max
приводит к проверке столбцов (навродеvalue <= max
) -
@Digits
приводит к определению точности и масштаба (когда-либо задавался вопросом, что это такое? Теперь с @Digits это легко)
Эти ограничения могут быть объявлены непосредственно в свойствах сущности или косвенно с использованием композиции ограничений.
Для получения дополнительной информации обратитесь к справочной документации Hibernate Validator http://docs.jboss.org/hibernate/stable/validator/reference/en-US/
22.2. Поиск Hibernate (Hibernate Search)
22.2.1. Описание
Полнотекстовые поисковые системы, такие как Apache Lucene, — это очень мощная технология для предоставления бесплатных текстовых/эффективных запросов для приложений. Если у вас есть несколько несоответствий при работе с объектной моделью домена (поддержание индекса в актуальном состоянии, несоответствие между структурой индекса и моделью домена, несоответствия при запросе ...) Hibernate Search индексирует вашу модель домена благодаря нескольким аннотациям, заботится о синхронизация базы данных/индекса и возвращает обычные управляемые объекты из бесплатных текстовых запросов. Hibernate Search использует Apache Lucene «под капотом».
22.2.2. Интеграция с аннотациями Hibernate
Hibernate Search интегрируется с Hibernate Core прозрачно, при условии, что jar-файл Hibernate Search
присутствует в classpath. Если вы не хотите автоматически регистрировать слушиватели событий
Hibernate Search, вы можете установить для hibernate.search.autoregister_listeners
значение false
. Такая необходимость очень необычна и не рекомендуется.
Для получения дополнительной информации обратитесь к справочной документации по Hibernate Search http://docs.jboss.org/hibernate/stable/validator/reference/en-US/