第3章 アーキテクチャ
3.1. 概観 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
下図は Hibernate アーキテクチャのハイレベルビューになります。
本書の範囲では、使用可能なランタイムアーキテクチャすべての詳細なビューは取り上げません。Hibernate は柔軟なため、複数のアプローチをサポートしています。ここでは、「最低限」のアーキテクチャと「包括的」なアーキテクチャの 2 つの極端な例を説明します。
下図は Hibernate がデータベースと設定データを使用して永続サービスや永続オブジェクトをアプリケーションに提供する方法を示しています。
「最低限」のアーキテクチャはアプリケーションが独自の JDBC 接続を提供し、独自のトランザクションを管理します。この方法では、Hibernate API の最低限のサブセットが使用されます。
「包括的」なアーキテクチャは、基盤となる JDBC や JTA の API から離れてアプリケーションを抽象化し、 Hibernate が詳細を管理できるようにします。
図内で示されているオブジェクトの定義は次のようになります。
- SessionFactory (
org.hibernate.SessionFactory) - 1 つのデータベースに対するコンパイルされたマッピングのスレッドセーフで不変のキャッシュです。
Sessionのファクトリであり、ConnectionProviderのクライアントです。SessionFactoryは、プロセスやクラスタレベルのトランザクション間で再利用可能なデータの任意 (2 次) キャッシュを保持することができます。 - Session (
org.hibernate.Session) - アプリケーションと永続ストアとの会話を表す、シングルスレッドで短命のオブジェクトです。JDBC コネクションをラッピングする
Transactionのファクトリです。Sessionは、オブジェクトグラフをナビゲーションする時、あるいは識別子でオブジェクトをルックアップする時に使用される永続オブジェクト(必須)の1 次キャッシュを保持します。 - 永続オブジェクトとコレクション
- 永続ステートとビジネス関数を持つ、短命で単一スレッドのオブジェクトです。 通常の JavaBean や POJO である場合もあります。1つの
Sessionのみに関連付けされます。Sessionが閉じられると分離され、すべてのアプリケーション層で使用可能です (プレゼンテーションへまたはプレゼンテーションから直接データ転送オブジェクトとしてなど)。 - 一時オブジェクトやコレクションおよび分離オブジェクトやコレクション
- 現在、
Sessionと関連していない、永続クラスのインスタンスです。アプリケーションによってインスタンス化され、まだ永続化されていない場合や、閉じられたSessionによってインスタンス化されている場合があります。 - トランザクション (
org.hibernate.Transaction) - (オプション) アトミックな作業単位を指定するためにアプリケーションが使用する単一スレッドで短命なオブジェクトです。基盤となる JDBC、JTA、CORBA トランザクションよりアプリケーションを抽象化します。場合によっては
Sessionが複数のトランザクションにわたることがあります。基盤となる API やトランザクションの使用に拘らずトランザクション境界は常に必須となります。 - ConnectionProvider (
org.hibernate.connection.ConnectionProvider) - (オプション) JDBC 接続のファクトリおよびプールです。基盤となる
DatasourceかDriverManagerよりアプリケーションを抽象化します。アプリケーションには公開されませんが、開発者が拡張および/または実装することは可能です。 - TransactionFactory (
org.hibernate.TransactionFactory) - (オプション)
Transactionインスタンスのファクトリです。アプリケーションには公開されませんが、開発者が拡張および/または実装することは可能です。 - 拡張インターフェース (Extension Interface)
- 永続層の挙動をカスタマイズできるようにするため、Hibernate には多くのオプションの拡張インタフェースが用意されています。詳細は API ドキュメントを参照してください。
「最低限」のアーキテクチャでは、アプリケーションは
Transaction や TransactionFactory、ConnectionProvider の API を迂回して JTA や JDBC と直接通信します。