第10章 オブジェクトを扱う

Hibernate は完全なオブジェクト/リレーショナルマッピングソリューションであり、データベース管理システムの詳細を開発者から見えなくするだけでなく、オブジェクトの 状態管理 も行います。これは、JDBC/SQL 永続層と同じような SQL statements の管理とは異なり、 Java アプリケーションの永続化に対する、自然なオブジェクト指向の考え方を提供します。
言いかえれば、 Hibernate を用いるアプリケーション開発者は、オブジェクトの 状態 については常に意識すべきであり、 SQL 文の実行については必ずしもそうではありません。この部分は、通常、 Hibernate が処理し、システムのパフォーマンスを調整するときにだけ、問題になってきます。

10.1. Hibernate におけるオブジェクトの状態

Hibernate は次のようなオブジェクトの状態を定義し、サポートしています:
  • 一時的(Transient) - new 演算子を使ってインスタンス化されただけで、Hibernate の Session に関連付けられていない場合、オブジェクトは一時的(Transient)なものとなります。それは、データベースに永続的な表現を持たず、識別子となる値は割り当てられていません。Transient インスタンスは、アプリケーションがその参照をどこにも保持しない場合に、ガベージコレクタによって破棄されます。オブジェクトを永続的 (persistent) な状態にするためには、 Hibernate の Session を使いましょう(Hibernate がこの遷移を実行する際に必要となるSQL 文を処理させることになります)。
  • 永続的 (Persistent) - 永続的なインスタンスは識別子値やデータベースに表現を持ちます。それは、保存やロードされている場合もあるかもしれませんが、定義上は、 Session のスコープの中に存在しています。Hibernate は、作業単位(Unit of Work)が完了したときに、永続状態のオブジェクトに加えられた変更を検出し、オブジェクトの状態とデータベースを同期します。オブジェクトを transient にするときは、開発者は、手作業で UPDATE 文や DELETE 文を実行しません。
  • 分離(Detached) - 分離(detached)インスタンスとは、永続化されているが、それと関連付いていた Session がクローズされているオブジェクトのことです。そのオブジェクトへの参照は、依然として有効です。そして、もちろん、detached インスタンスはこの状態に修正することさえできます。 detached インスタンスは、後にもう一度永続化したい(そして、すべての変更を永続化したい)ときに、新しい Session に再追加できます。この機能は、ユーザーが考える時間を必要とするような、長期間に及ぶ作業単位に対するプログラミングモデルを可能にします。これを アプリケーションのトランザクション(application transaction) と呼んでいます。すなわち、ユーザーから見た作業単位です。
これから、状態と状態遷移(そして、遷移のトリガとなる Hibernate のメソッド)について、詳細に述べます。