Глава 22. Дополнительные модули

Оглавление
  1. 22.1. Проверка бинов (Bean Validation)
    1. 22.1.1. Добавление Проверки бинов (Bean Validation)
    2. 22.1.2. Конфигурация
    3. 22.1.3. Перехват нарушений
    4. 22.1.4. Схема базы данных
  2. 22.2. Поиск Hibernate (Hibernate Search)
    1. 22.2.1. Описание
    2. 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. Возможны несколько вариантов:

Заметка

Вы можете использовать и callback, и ddl вместе, установив свойство для обратного callback, dll

<persistence ...>
    <persistence-unit ...>
        ...
        <properties>
            <property name="javax.persistence.validation.mode"
                    value="callback, ddl" />
        </properties>
    </persistence-unit>
</persistence>

Это эквивалентно auto, за исключением того, что, если отсутствует поставщик Bean Validation, возникает исключение.

Если вы хотите проверить разные группы во время установки, обновления и удаления, используйте:

Каждое свойство принимает полностью квалифицированные имена классов проверяемых групп, разделенных запятой (,)

Пример 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 для создания точной схемы базы данных:

Эти ограничения могут быть объявлены непосредственно в свойствах сущности или косвенно с использованием композиции ограничений.

Для получения дополнительной информации обратитесь к справочной документации 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/