Hibernate

**Hibernate** は、Java のためのオブジェクト関係マッピング (ORM) ライブラリであり、オブジェクト指向のドメインモデルを関係データベースにマッピングするためのフレームワークを提供する。Hibernate は、永続性に関わるデータベースアクセスを直接高レベルなオブジェクト操作機能に置換することでオブジェクト指向と関係モデルの不整合を解決する。

Hibernate はオープンソースの自由ソフトウェアであり、GNU Lesser General Public License で提供されている。

## 機能概要
第一の機能は、Javaクラスからデータベースの表（およびJavaデータ型からSQLデータ型）へのマッピングである。また、データのクエリと検索機能も提供する。SQL呼び出しを自動生成することで、開発者がSQL呼び出しの結果をいちいちオブジェクトに変換する手間から解放し、性能への影響を最小にしつつ、あらゆるSQLデータベースへの移植性を達成している。

Hibernateは Plain Old Java Object (POJO) のための透過的永続性を提供する。永続性クラスに要求されることは、引数のないコンストラクタが存在することであり、コンストラクタの可視性が*public*でなくともよい（一部アプリケーションでは、*equals()*と*hashCode()*メソッドにも注意が必要http://www.hibernate.org/109.html）。

Hibernateには「ダーティチェッキング」機能がある。この機能は、永続的オブジェクトの変更されたフィールドについてのみSQLによる更新を行うもので、不必要なデータベース更新を削減する。

Hibernateは「HQL」というSQLライクなクエリ言語を提供している。オブジェクト指向的な代替手段としてクライテリアクエリも提供されている。

HibernateはスタンドアローンのJavaアプリケーションにも使えるし、Java ServletやEJBセッションビーンを使ったJakarta EEアプリケーションにも使える。

## 歴史
HibernateはGavin Kingをリーダーとして世界中のJavaソフトウェア開発者がチームを結成して開発した。その後、JBoss社（現在はレッドハットの一部）がHibernateの主要開発者を雇い入れ、サポートを行うようになった。

バージョン3.xでは、Interceptor/Callbackアーキテクチャ、ユーザ定義フィルタ、JDK 5.0アノテーション（Javaのメタデータ機能）などの新機能が新たに追加された。このバージョンはEJB 3.0仕様とも非常に近く（ただし、EJB 3.0仕様が完成しJava Community Processによってリリースされる前にリリースされた）、JBossのEJB 3.0実装の基盤となった。

## モジュール
Hibernateはモジュール化され、それぞれ独立したチームが開発している。

; ORM (4.1より前はCore)
: 主モジュールであり、主要機能が全て実装されている（`Session` サポート、トランザクション管理、オブジェクト・キャッシング、HQL）。
; Annotations
: JSR 175 のアノテーションサポート（JSR 220 JPAアノテーション標準に準拠）。XMLによるメタデータマッピングの代替手法を提供する。
; Entity manager
: Coreモジュールのラッパーであり、JSR 220 JPA Entity Manager標準をサポート
; Envers
: 履歴管理
; Metamodel Generator
:
; OGM
: Object/Grid Mapper。NoSQL対応。 
; Search
: Hibernateで管理されている永続性実体群に対して、Luceneを使った検索を行うための抽象化層を提供するモジュール
; Shards
: Hibernate Coreの縦分割を提供するモジュール
; Tools
: Apache Antのタスク群やEclipseプラグインなど、Hibernateを使った開発に役立つモジュール
; Validator
: 一般的なデータベースの制約（数値の範囲、文字列形式、nullチェックなど）をアノテーションを使って検証可能にするモジュール

## 永続性クラスのマッピング
JavaオブジェクトとSQLの変換をするには、JavaクラスとSQLテーブルの間の「マッピングデータ」がなければならない。Hibernateはこのためのいくつかの手段を提供する。

; XMLメタデータ
: 最も一般的な手法。各クラス（とそのプロパティ群）は、所定のDTDスキーマに対応したXML文書にて、XML要素として表現される。
; アノテーションによるメタデータ
: JSR 175に準拠して、永続性クラスのソースコードに注釈として記述する。Hibernateがそれを解釈して設定ファイルにそのクラスに関する情報を追加する（あるいは、実行時に`Configuration`インスタンスに追加する）。アノテーション機能は別モジュール化されている。
; XDocletメタデータ
: JSR 175およびJava 5.0がリリースされる以前に、アノテーションと似たような機能を実装したもの。XDoclet属性は永続性クラスのソースファイル上で記述され、Apache Antの独立したタスクで構文解析され、XMLメタデータを生成する。
; メタデータのプログラムからの操作
: Hibernateは、`SessionFactory`のインスタンスを生成する前に、マッピングの詳細を操作するAPI（`Configuration`インスタンスを使用）も提供している。

## ダーティチェッキング
不要なSQLによる更新を防ぐため、Hibernateはダーティチェッキングという機能を提供している。この機能は、永続的オブジェクトの変更されたフィールドやコレクションのみを更新できるようにするものである。コレクションに含まれない部分の更新が必要かどうかを確認するため、Hibernateはそれらのフィールドを`Object.equals()`メソッドで比較する。一方、コレクションフィールド（<code>java.util.List</code>や<code>java.util.Set</code>など）は同一性（参照）比較を行う。

## API
Hibernate APIは、パッケージ org.hibernateで提供されている。

; org.hibernate.SessionFactoryインタフェース
: 新たなHibernateセッションを生成するイミュータブルでスレッドセーフなオブジェクトへの参照。Hibernateベースのアプリケーションは、一般にこのインタフェースを実装したクラスのインスタンスを1つだけ使う（Singleton パターン を利用）。
; org.hibernate.Sessionインタフェース
: Hibernateセッション、すなわちデータベース上で行う操作の主要ポイントを表す。オブジェクトの永続性状態（一時的、永続的、分離）を管理し、データベースから永続的オブジェクトを取り出し、トランザクション境界を管理する。セッションは、データベース上の論理トランザクションと同程度に維持されることを意図している。セッションはスレッドセーフではなく、複数のクライアントから使われることを意図していない。

## 脚注



## 関連項目
* EJB 3.0
* NHibernate
* Spring Framework
* シリアライズ
* iBATIS
* Service Data Objects
* Apache Struts

## 参考文献

* Christian Bauer, Gavin King: Java Persistence with Hibernate, Manning Publications Company, ISBN 1-932394-88-5
* Christian Bauer, Gavin King: Hibernate In Action, Manning Publications Company, ISBN 1-932394-15-X
* Will Iverson: Hibernate: A J2EE™ Developer's Guide, Addison Wesley Professional, ISBN 0-321-26819-9
* James Elliott: Hibernate: A Developer's Notebook, O'Reilly, ISBN 0-596-00696-9

## 外部リンク
*
*Interview with Gavin King, founder of Hibernate