第4章 追加モジュール

Hibernate Annotations は主に永続化データにフォーカスします。プロジェクトは 2 つの Hibernate モジュールとの統合に適しています。

4.1. Hibernate Validator

4.1.1. 説明

ドメインモデルに不変条件を指定するには、アノテーションが非常に便利で簡潔な方法となっています。たとえば、プロパティを null にしないこと、口座残高を常にプラスにすることなどを指定できます。これらのドメインモデル制約はプロパティをアノテートすることによって Bean 自体で宣言されます。Validator はこれらの制約を読み取り、制約の違反を調べることができます。検証メカニズムは、これらのルールをコピーせずにアプリケーションの異なる層 (プレゼンテーション層、データアクセス層) で実行できます。DRY の原則に準拠したHibernate Validator はこのために設計されました。
Hibernate Validator は 2 つのレベルで動作します。最初にクラスのメモリ内インスタンスに制約違反がないかチェックします。次に、制約を Hibernate メタモデルに適用し、生成されたデータベーススキーマに組み込むことができます。
各制約アノテーションは、エンティティインスタンスの制約をチェックする Validator 実装に関連付けられます。また、Validator は、Hibernate メタモデルに制約を (オプションで) 適用することもできます (Hibernate は制約を表現する DDL を生成できます)。適切なイベントリスナを使用すると、Hibernate による挿入時と更新時にチェック操作を実行できます。Hibernate Validator は Hibernate との使用に制限されません。アプリケーションのどこでも簡単に使用できます。
実行時にインスタンスをチェックするときに、Hibernate Validator は制約違反に関する情報を InvalidValue のアレイで返します。他の情報では、InvalidValue にはアノテーション (長さ制限など) でバンドルされたパラメータ値を組み込むことができるエラー説明メッセージと ResourceBundle に外部化できるメッセージ文字列が含まれます。

4.1.2. Hibernate Annotations との統合

Hibernate Validator (hibernate-validator.jar) がクラスパスで利用可能な場合、Hibernate Annotations は以下の 2 つの方法で統合されます。
  • 制約は Data Definition Language に適用されます。つまり、データベーススキーマは制約を反映します (hbm2ddl ツールを使用する場合)。
  • エンティティ変更がデータベースに適用される (挿入または更新) 前に、エンティティが検証されます。検証エラー (発生した場合) は InvalidStateException によって処理されます。
検証ルールなしのエンティティの場合は、実行時のパフォーマンスコストは null になります。
DDL への制約伝播を無効にするには、設定ファイルで hibernate.validator.apply_to_ddl を false に設定します。このような作業は一般的ではなく、推奨されません。
pre-entity 変更の検証を無効にするには、設定ファイルでhibernate.validator.autoregister_listeners を false に設定します。このような作業は一般的ではなく、推奨されません。
詳細については、Hibernate Validator リファレンスドキュメンテーションを参照してください。