Hibernate 4.0のリリースから2ヶ月経たないうちにJBossはHibernateのバージョン4.1をリリースした。Hibernateはオープンソースのオブジェクト/リレーショナルマッピングフレームワークだ。このマイナーバージョンアップデートにはいくつかの修正と改善が含まれているが、Hibernateの監査モジュール(Enversと呼ばれていた)には新しい機能が追加されている。
データベースの履歴を保持するのは企業が利用するアプリケーションに共通の要件だ。参照用のデータの履歴を持つことでデータの状態を振り返り、過去の意思決定を再現することができる。また、セキュリティに敏感な組織にとってはデータの監査も必須の要件だ。いつでも"バックログ"を読んでデータベースのテーブルの現在の状態までの状態遷移(とどのユーザが変更を行ったか)を把握できるようにする必要がある。
この要件を実現するには独自の実装が必要だ。例えば、監査が必要なテーブルの状態の変化をすべて保持する第2のテーブルを使う方法だ。この方法の場合、第1のテーブルは現在の状態だけを保持し、第2のテーブルがすべての中間状態といくつかのメタデータ(例えば、タイムスタンプや変更を行ったユーザ)を保持する。そして、データベースにアクセスする既存のコードは2つの段階に別ける必要がある。ひとつは変更前の状態を履歴テーブルに保存する段階、そしてもうひとつは実際にデータを変更する段階だ。また、新しく書くコードもこの2つの段階に別けなければならない。
HibernateのEnversモジュールはこの問題を透過的な方法で解決する。監査対象のエンティティの履歴テーブルは必要だが、履歴の管理はEnversが透過的に自動的に行ってくれるのだ。アプリケーションのコードもほとんど変更する必要はない(Hibernateアノテーションが使われていれば)。Enversの機能はSubversionに似ている。各変更によってデータベース内に新しいリビジョンが作られるのだ。
Enversには現在の状態ではなく、特定のリビジョンのデータベースに対して問い合わせをすることができるAPIがある。Enversはバージョン3.6でHibernate(とJBoss Application Server)に統合された。したがって、上述した機能はHibernate 4.0でも利用可能だった。
新しいHibernate 4.1では各エンティティの属性の変更を追跡する機能が追加された。例えば監査対象のエンティティの属性の現在の状態が不正な状態の可能性があり、アプリケーションのユーザがその属性が最後に変更された時のバージョンを知りたい場合、EnversのAPIでは対象のエンティティの以前のバージョンを検索して、差異を調べて見つかったバージョンが不正を引き起こした変更を関連しているかどうかを判定する必要がある。一方、新しく追加されたAuditPropertyクラスのhasChanged()メソッドを使えば、対象のリビジョンを直接見つけることができる。
更なる情報はJavadocsを参照されたい。