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>

MavenCentralhibernate-coreおよびH2ドライバーの最新バージョンを確認してください。

3. ブートストラップAPI

ブートストラップとは、SessionFactoryを構築して初期化するプロセスを指します。

この目的を達成するには、Hibernateに必要なサービスを保持するServiceRegistryが必要です。 このレジストリから、アプリケーションのドメインモデルとデータベースへのマッピングを表すメタデータオブジェクトを構築できます。 。

これらの主要なオブジェクトをさらに詳しく調べてみましょう。

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にあります。