Hibernate は O/R マッピングツールと呼ばれる、リレーショナルデータベースとオブジェクトモデルとの間を埋めるフレームワークです。

Hibernate は独自のオブジェクトクエリ言語 HQL を使って、非常にハイパフォーマンスな検索を可能にしています。それだけでなく、高度なキャッシュ機構など、実行時のパフォーマンスを向上させる機能が盛りだくさんです。

ドキュメントも豊富にそろっていて、リファレンスマニュアル (日本語翻訳済み) が非常に参考になります。マニュアルの中から、気になった部分や使えそうな部分だけを抜き出しておきます。

[参考]

Hibernate の特徴

  1. Hibernate とは
  2. Hibernate で使えるPOJOクラスの条件
  3. とりあえず動かすのに必要なライブラリ
  4. Hibernate で使われる用語

Hibernate とは

Hibernate は POJO と呼ばれる普通のJavaクラス(フレームワークの都合でインターフェースやスーパークラスを実装しなくてもよい)を扱います。JDBC でアクセスするリレーショナルデータベースのみを対象としています。

基本的には、POJOのクラスが一つのテーブルを表し、インスタンスが一行を表す形で表現されます。マッピング情報は、XDoclet というマークアップ言語をつかってソースコード中に書く方法と、マッピングファイルとしてリソースで定義する方法があります。

Hibernate では、オブジェクト検索のために、HQL (Hibernate Query Languate) というクエリ言語を提供しています。SQLのようなものです。Hibernateでは、オブジェクト検索に3つの方法が使えます。

  1. HQLを使った問い合わせ
  2. Criteria というクエリオブジェクトを使った問い合わせ
  3. SQL 文を直接発行

静的な検索条件でオブジェクトを検索するときには HQL を使い、動的な検索条件がある場合には Criteria オブジェクト を使い、どうしても HQL でかけない複雑な検索文の場合には SQL 文を使います。

Hibernate は O/Rマッピングツールです。リレーショナルデータベースとオブジェクトモデルのインピーダンスミスマッチと呼ばれる考え方の違いを吸収するためのものです。

[参考]

Hibernate で使えるPOJOクラスの条件

Hibernate はPOJOを扱います。POJOといっても、どんなJavaクラスでもよいかというとそうではありません。4つだけ制約があります。

1. 永続フィールドに対するアクセサを定義する

いわゆる getter/setter と呼ばれる、フィールドへのアクセサメソッドを定義する必要があります。JavaBean 形式のスタイルをサポートし、getFoo, isFoo, setFoo のような形のメソッド名を認識します。

アクセサは、public である必要はありません。private、デフォルト、protected のアクセサメソッドがあるフィールドも、永続化の対象にできます。

2. デフォルトコンストラクタを用意する

デフォルトコンストラクタを定義する必要があります。このコンストラクタも、public である必要はありません

3. 識別子プロパティを用意する (オプション)

データベース中のレコードを一意に識別できるプロパティを用意します。これは、必須ではありませんが、よりよい設計のために推奨されます。

オブジェクト型 (nullを許容できる型) で、ビジネス的に意味のないものが理想的だとされています。java.lang.Long や java.lang.String が柔軟性があり推奨されています。

4. finalクラスにしない (オプション)

Hibernate のプロキシクラスは、final でない永続化クラスかインターフェースに依存します。これも必須ではありませんが、プロキシを使うとパフォーマンスチューニングのオプションが可能になるため、推奨されます。

equals と hashCode をオーバーライドする

永続化対象のクラスは、識別子(主キー)を比較して等価なことを証明するべきです。つまり、識別子のみを使って equals() と hashCode() メソッドをオーバーライドするべきです。

識別子には、ビジネスにおける等価キー(ドメイン内で同一オブジェクトとみなせるキー)を使うことが推奨されます。

とりあえず動かすのに必要なライブラリ

Hibernate を動かすのに必要なクラスは、下記の通り(余分なのもあるかも)です。JTA ライブラリが必要とのこと(分散トランザクションをサポートする場合)。これらのファイルは全部、Hibernate をダウンロードすると lib フォルダの中にそろっています。

  1. hibernate2.jar
  2. cglib-full.jar
  3. commons-collections.jar
  4. commons-lang.jar
  5. commons-beanutils.jar
  6. commons-logging.jar
  7. dom4j.jar
  8. odmg.jar
  9. xalan.jar
  10. xerces.jar
  11. xml-apis.jar
  12. jta.jar

Hibernate で使われる用語

Hibernate で使われている用語の整理です。

永続化エンティティ

独立して永続化されるクラスのこと。他のどのオブジェクトとも関係なく作成、問い合わせ、削除することができる。Hibernate では、テーブルとマッピングされるクラスのことだと考えると分かりやすいはず。

コンポーネント(コンポジット)

独立して永続化されないクラスのこと。これを所持する親クラスが永続化されるときに関連を通して永続化されるクラス。他のエンティティの従属部分としてのみデータベースに保存したり検索したりできる。テーブルの一部を利用して作られたクラス。

Session (net.sf.hibernate.Session)

アプリケーションと、永続機構との対話を行う。一つのJDBC コネクションだと考えるといいと思います。複数のトランザクションを横断することもあります。スレッドセーフではないので、複数のスレッドで共有することはできません。

Transaction (net.sf.hibernate.Transaction)

アプリケーションが使う作業の最小単位。

@hibernate.class (XDoclet タグ)

永続化エンティティだということを示すタグ。クラス宣言の JavaDoc コメントに書く。

[参考]

XDoclet - @hibernate.class (0..1)

@hibernate.id (XDoclet タグ)

そのプロパティが識別子だということを示すタグ。メソッド宣言の JavaDoc コメントに書く。

[参考]

XDoclet - @hibernate.id (0..1)

@hibernate.property (XDoclet タグ)

そのプロパティをテーブルのカラムとマッピングするときに使用するタグ。メソッド宣言の JavaDoc コメントに書く。

[参考]

XDoclet - @hibernate.property (0..1)

カスケード (cascade)

操作を関連オブジェクトへ伝播させるかどうかを指定するもの。指定できる値は none, all, save-update, delete。none は伝播させない。save-update は更新系の操作 (insert, update) を伝播させる。delete は削除系の操作 (delete) を伝播させる。all は save-update と delete の両方を伝播させる。

[参考]

WEB-DB Press 18号

遅延ロード

関連オブジェクトをコレクションで保持する場合、最初にアクセスされるまでオブジェクトのロードを遅らせること。lazy 属性に true を指定することで可能になる。リソースの節約やパフォーマンスの向上に効果がある。

Open Session in View

遅延ロードは、ロードされる際に親オブジェクトに有効な Session が関連付けれらていなければならない。Webアプリケーションでは、JSP で最初にコレクションにアクセスすることが多いため、Session の開始と終了をビューで行わなければならない。これを行うための手段の一つ。

[参考]

Hibernate.org - Open Session in View

generator

generator は主キーの生成方法を指定する id タグ (@hibernate.id) の要素です。increment, identity, sequence, hilo, seqhilo, uuid.hex, uuid.string, native, assigned, foreigh が使えます。

  • increment は単純にIDを増加させるもの
  • identity, sequence はDBMS によってサポートされている同名の ID 生成機能を使う
  • hilo, seqhilo はhi/lo アルゴリズムを使ってIDを生成する
  • uuid.hex, uuid.string はUUID アルゴリズムを使ってIDを生成する
  • native はDBMSの種類を判別して、identity, sequence, hilo を使い分けてとりあえず主キーを生成してくれる
  • assigned はアプリケーション側でIDを設定することを示す
  • foreign はone-to-one で関連付けられているオブジェクトのIDを使用する
One-to-One 関係

一対一の関係のこと。継承関係のテーブルがそれにあたる。同一の主キーを持つ関係。

Many-to-One 関係

多対一の関係のこと。外部キーを持つテーブルから見た場合の関係。参照関係。

One-to-Many 関係

一対多の関係のこと。主キーを持つテーブルから、外部キーを持つテーブルを保持する関係。親子関係。

Many-to-Many 関係

多対多の関係のこと。関連テーブルを使用する場合の関係。One-to-Many と Many-to-Oneが相互に発生する場合。

Dialect

Hibernate で使われるデータベースの種類のこと。SQLの方言に対応するために使われるクラス。

SessionFactory (net.sf.hibernate.SessionFactory)

Hibernateとやり取りするための Session オブジェクトを提供する。スレッドセーフなので、アプリケーション全体で一つの SessionFactory オブジェクトをつかうようにするとよい。(正確には、データベースごとに一つあればよい)

LazyInitializationException(遅延初期化例外)

Hibernateのセッションを閉じた後で初期化されていない遅延コレクションにアクセスしようとすると投げられる例外。Hibernateは遅延ロードという仕組みを使うことができる。これは、コレクションに最初にアクセスしたときにその内容を初期化するようにする仕組み。

参考

  • Hibernate のリファレンスドキュメント (日本語) Hibernate Reference Document

  • Hibernate だけでなく、データベース設計にまで触れられていておすすめ。

  • 薄いながらも十分な情報量。HibernateとSpringにも触れられています。
  • Hibernate の基本的な使い方が載っています。
  • 開発者のための Hibernate の解説書が日本語で登場しました。