Chapter 4. Additional modules

Hibernate Annotations mainly focus on persistence metadata. The project also have a nice integration with two Hibernate modules.

4.1. Hibernate Validator

4.1.1. Description

Annotations are a very convenient and elegant way to specify invariant constraints for a domain model. You can, for example, express that a property should never be null, that the account balance should be strictly positive, etc. These domain model constraints are declared in the bean itself by annotating its properties. A validator can then read them and check for constraint violations. The validation mechanism can be executed in different layers in your application without having to duplicate any of these rules (presentation layer, data access layer). Following the DRY principle, Hibernate Validator has been designed for that purpose.

Hibernate Validator works at two levels. First, it is able to check in-memory instances of a class for constraint violations. Second, it can apply the constraints to the Hibernate metamodel and incorporate them into the generated database schema.

Each constraint annotation is associated to a validator implementation responsible for checking the constraint on the entity instance. A validator can also (optionally) apply the constraint to the Hibernate metamodel, allowing Hibernate to generate DDL that expresses the constraint. With the appropriate event listener, you can execute the checking operation on inserts and updates done by Hibernate. Hibernate Validator is not limited to use with Hibernate. You can easily use it anywhere in your application.

When checking instances at runtime, Hibernate Validator returns information about constraint violations in an array of InvalidValue s. Among other information, the InvalidValue contains an error description message that can embed the parameter values bundle with the annotation (eg. length limit), and message strings that may be externalized to a ResourceBundle .

4.1.2. Integration with Hibernate Annotations

If Hibernate Validator (hibernate-validator.jar) is available in the classpath, Hibernate Annotations will integrate in two ways:

  • Constraints will be applied to the Data Definition Language. In other words, the database schema will reflect the constraints (provided that you use the hbm2ddl tool).

  • Before an entity change is applied to the database (insert or update), the entity is validated. Validation errors, if any, will be carried over through an InvalidStateException.

For entities free of validation rules, the runtime performance cost is null.

To disable constraint propagation to DDL, set up hibernate.validator.apply_to_ddl to false in the configuration file. Such a need is very uncommon and not recommended.

To disable pre-entity change validation, set up hibernate.validator.autoregister_listeners to false in the configuration file. Such a need is very uncommon and not recommended.

Check the Hibernate Validator reference documentation for more information.

4.2. Hibernate Search

4.2.1. Description

Full text search engines like Apache Lucene™ are a very powerful technology to bring free text/efficient queries to applications. If suffers several mismatches when dealing with a object domain model (keeping the index up to date, mismatch between the index structure and the domain model, querying mismatch...) Hibernate Search indexes your domain model thanks to a few annotations, takes care of the database / index synchronization and brings you back regular managed objects from free text queries. Hibernate Search is using Apache Lucene under the cover.

4.2.2. Integration with Hibernate Annotations

Hibernate Search integrates with Hibernate Annotations transparently provided that hibernate-search.jar is present in the classpath. If you do not wish to automatically register Hibernate Search event listeners, you can set hibernate.search.autoregister_listeners to false. Such a need is very uncommon and not recommended.

Check the Hibernate Search reference documentation for more information.