Hibernate5ブートストラップAPI
1. 概要
このチュートリアルでは、HibernateSessionFactoryを初期化して開始できる新しいメカニズムについて説明します。バージョン5.0で再設計された新しいネイティブブートストラッププロセスに特に焦点を当てます。
バージョン5.0より前では、アプリケーションは Configuration クラスを使用してSessionFactoryをブートストラップする必要がありました。Hibernateのドキュメントでは、に基づく新しいAPIの使用が推奨されているため、このアプローチは廃止されました。 ServiceRegistry。
簡単に言えば、 SessionFactoryの構築とは、起動時と実行時の両方でHibernateが必要とするサービスを保持するServiceRegistry実装を持つことです。
2. Mavenの依存関係
新しいブートストラッププロセスの調査を開始する前に、 hibernate-corejarファイルをプロジェクトのクラスパスに追加する必要があります。 Mavenベースのプロジェクトでは、pom.xmlファイルでこの依存関係を宣言する必要があります。
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.4.0.Final</version>
</dependency>
HibernateはJPAプロバイダーであるため、これにはJPAAPIの依存関係も一時的に含まれます。
また、使用しているデータベースのJDBCドライバーも必要です。 この例では、埋め込まれたH2データベースを使用します。
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.197</version>
</dependency>
MavenCentralのhibernate-coreおよびH2ドライバーの最新バージョンを確認してください。
3. ブートストラップAPI
ブートストラップとは、SessionFactoryを構築して初期化するプロセスを指します。
これらの主要なオブジェクトをさらに詳しく調べてみましょう。
3.1. サービス
ServiceRegistry の概念を掘り下げる前に、まずServiceがであるかを理解する必要があります。Hibernate5.0では、Serviceは同じ名前のインターフェースによって表される機能のタイプ:
org.hibernate.service.Service
デフォルトでは、Hibernateは最も一般的な Services の実装を提供し、ほとんどの場合、それらで十分です。 それ以外の場合は、独自の Services を構築して、元のHibernate機能を変更するか、新しい機能を追加することができます。
次のサブセクションでは、HibernateがこれらのサービスをServiceRegistryと呼ばれる軽量コンテナーを介して利用できるようにする方法を示します。
3.2. ServiceRegistry
SessionFactory を構築する最初のステップは、 ServiceRegistryを作成することです。これにより、Hibernateに必要な機能を提供し、に基づくさまざまなサービスを保持できます。 JavaSPI機能。
技術的に言えば、 ServiceRegistry は、BeanのタイプがServiceのみである軽量の依存性注入ツールと見なすことができます。
ServiceRegistry には2つのタイプがあり、階層的です。 1つ目はBootstrapServiceRegistryで、親がなく、これら3つの必要なサービスを保持します。
- ClassLoaderService:により、Hibernateはさまざまなランタイム環境のClassLoaderと対話できます。
- IntegratorService:は、 Integrated サービスの検出と管理を制御し、サードパーティアプリケーションをHibernateと統合できるようにします
- StrategySelector:は、さまざまな戦略契約の実装を解決します
BootstrapServiceRegistry実装を構築するには、BootstrapServiceRegistryBuilderファクトリクラスを使用します。これにより、これら3つのサービスをタイプセーフな方法でカスタマイズできます。
BootstrapServiceRegistry bootstrapServiceRegistry = new BootstrapServiceRegistryBuilder()
.applyClassLoader()
.applyIntegrator()
.applyStrategySelector()
.build();
2番目のServiceRegistryはStandardServiceRegistryで、以前のBootstrapServiceRegistryに基づいており、上記の3つのサービス を保持します。さらに、Hibernateに必要な他のさまざまなサービスが含まれています。 StandardServiceInitiatorsクラスにリストされています。
以前のレジストリと同様に、 StandardServiceRegistryBuilder を使用して、 StandardServiceRegistry:のインスタンスを作成します。
StandardServiceRegistryBuilder standardServiceRegistry =
new StandardServiceRegistryBuilder();
内部的には、 StandardServiceRegistryBuilder は、 BootstrapServiceRegistryのインスタンスを作成して使用します。オーバーロードされたコンストラクターを使用して、作成済みのインスタンスを渡すこともできます。
BootstrapServiceRegistry bootstrapServiceRegistry =
new BootstrapServiceRegistryBuilder().build();
StandardServiceRegistryBuilder standardServiceRegistryBuilder =
new StandardServiceRegistryBuilder(bootstrapServiceRegistry);
このビルダーを使用して、デフォルトの hibernate.cfg.xml などのリソースファイルから構成をロードし、最後に build()メソッドを呼び出して次のインスタンスを取得します。 StandardServiceRegistry。
StandardServiceRegistry standardServiceRegistry = standardServiceRegistryBuilder
.configure()
.build();
3.3. メタデータ
タイプBootstrapServiceRegistryまたはStandardServiceRegistryのいずれかのServiceRegistryをインスタンス化することにより、必要なすべての Services を構成したら、アプリケーションのドメインモデルの表現を提供する必要があります。およびそのデータベースマッピング。
MetadataSourcesクラスがこれを担当します。
MetadataSources metadataSources = new MetadataSources(standardServiceRegistry);
metadataSources.addAnnotatedClass();
metadataSources.addResource()
次に、メタデータのインスタンスを取得します。これは、最後の手順で使用します。
Metadata metadata = metadataSources.buildMetadata();
3.4. SessionFactory
最後のステップは、以前に作成したメタデータ:からSessionFactoryを作成することです。
SessionFactory sessionFactory = metadata.buildSessionFactory();
これで、セッションを開いて、エンティティの永続化と読み取りを開始できます。
Session session = sessionFactory.openSession();
Movie movie = new Movie(100L);
session.persist(movie);
session.createQuery("FROM Movie").list();
4. 結論
この記事では、 SessionFactoryを構築するために必要な手順について説明しました。プロセスは複雑に見えますが、3つの主要な手順にまとめることができます。最初に StandardServiceRegistry のインスタンスを作成し、次にのインスタンスを作成しました。 メタデータオブジェクトを作成し、最後にSessionFactory。を作成しました。
これらの例の完全なコードは、Githubのにあります。