Hibernate 5ブートストラップAPI

1. 概要

このチュートリアルでは、Hibernate _SessionFactory._を初期化して開始できる新しいメカニズムを調査します。バージョン5.0で再設計された新しいネイティブブートストラッププロセスに特に焦点を当てます。
バージョン5.0より前では、アプリケーションはdocumentation_Configuration_クラスを使用して_SessionFactory._をブートストラップする必要がありました。Hibernateのドキュメントでは_ServiceRegistry._に基づいた新しいAPIの使用が推奨されているため、このアプローチは廃止されました
簡単に言えば、_SessionFactory_を構築するということは、Hibernateが必要とする_Services_を保持する_ServiceRegistry_ implementationを持ち、起動とランタイムの両方を行うことです。

2. Mavenの依存関係

新しいブートストラッププロセスの調査を開始する前に、_hibernate-core_ jarファイルをプロジェクトクラスパスに追加する必要があります。 Mavenベースのプロジェクトでは、_pom.xml_ファイルでこの依存関係を宣言するだけです。
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>5.4.0.Final</version>
</dependency>
HibernateはJPAプロバイダーであるため、これにはJPA API依存関係も推移的に含まれます。
また、使用しているデータベースのJDBCドライバーも必要です。 この例では、埋め込みH2データベースを使用します。
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.197</version>
</dependency>
versions_https://search.maven.org/search?q = g:org.hibernate%20AND%20a:hibernate-coreの最新バージョンを自由に確認してください。

*3. ブートストラップAPI *

ブートストラップとは、_SessionFactory._を構築および初期化するプロセスを指します。
*この目的を達成するには、Hibernateが必要とする_Services_を保持する_ServiceRegistry_が必要です。 このレジストリから、アプリケーションのドメインモデルとデータベースへのマッピングを表す_Metadata_オブジェクトを作成できます*。
これらの主要なオブジェクトをさらに詳しく調べてみましょう。

* 3.1。 サービス*

_ServiceRegistry_の概念を掘り下げる前に、まず_Service_ is __.__を理解する必要があります。Hibernate5.0では、_Service_は同じ名前のインターフェイスで表される機能の一種です。
org.hibernate.service.Service
デフォルトでは、Hibernateは最も一般的な「_Services_」の実装を提供しますが、ほとんどの場合はそれらで十分です。 それ以外の場合は、独自の_Services_を構築して、元のHibernate機能を変更するか、新しい機能を追加できます。
次のサブセクションでは、_ServiceRegistry._と呼ばれる軽量コンテナーを介してこれらの_Services_をHibernateがどのように利用可能にするかを示します。

* 3.2。 ServiceRegistry *

_SessionFactory_を構築する最初のステップは、_ServiceRegistry._を作成することです。これにより、Hibernateに必要な機能を提供するさまざまな_Services_を保持でき、https://www.baeldung.com/java-spi [Java SPI]機能に基づいています。
技術的に言えば、_ServiceRegistry_は、Beanのタイプが_Serviceのみである軽量の依存性注入ツールとして見ることができます。
_ServiceRegistry_には2つのタイプがあり、それらは階層的です__.__ * 1つ目は_BootstrapServiceRegistry_です。
  • ClassLoaderService:_は、Hibernateが
    さまざまなランタイム環境の_ClassLoader

  • _IntegratorService:_の検出と管理を制御します
    _Integrator_サービスにより、サードパーティアプリケーションをHibernateと統合できます

  • _StrategySelector:_は、さまざまな戦略の実装を解決します
    契約

    • _ BootstrapServiceRegistry_実装を構築するには、_BootstrapServiceRegistryBuilder factoryクラスを使用します。これにより、これら3つのサービスをタイプセーフな方法でカスタマイズできます。

BootstrapServiceRegistry bootstrapServiceRegistry = new BootstrapServiceRegistryBuilder()
  .applyClassLoader()
  .applyIntegrator()
  .applyStrategySelector()
  .build();
  • 2番目の_ServiceRegistry_は_StandardServiceRegistry_です。これは、前の_BootstrapServiceRegistry_に基づいて構築され、上記の3つの_Services_を保持します/hibernate-orm/blob/master/hibernate-core/src/main/java/org/hibernate/service/StandardServiceInitiators.java[StandardServiceInitiators]クラス。

    前のレジストリと同様に、__StandardServiceRegistryBuilder __を使用して_StandardServiceRegistryのインスタンスを作成します:_
StandardServiceRegistryBuilder standardServiceRegistry =
  new StandardServiceRegistryBuilder();
内部では、_StandardServiceRegistryBuilder_は_BootstrapServiceRegistry._のインスタンスを作成して使用します。また、オーバーロードされたコンストラクターを使用して、既に作成されたインスタンスを渡すこともできます。
BootstrapServiceRegistry bootstrapServiceRegistry =
  new BootstrapServiceRegistryBuilder().build();
StandardServiceRegistryBuilder standardServiceRegistryBuilder =
  new StandardServiceRegistryBuilder(bootstrapServiceRegistry);
このビルダーを使用して、default _hibernate.cfg.xml_などのリソースファイルから構成をロードし、最後に_build()_メソッドを呼び出して_StandardServiceRegistry._のインスタンスを取得します。
StandardServiceRegistry standardServiceRegistry = standardServiceRegistryBuilder
  .configure()
  .build();

* 3.3。 Metadata *

タイプ__BootstrapServiceRegistryまたはStandardServiceRegistryのいずれかの_ServiceRegistry_をインスタンス化することによって必要なすべての_Services_を構成したら、__ **アプリケーションのドメインモデルとそのデータベースマッピングの表現を提供する必要があります**。
_MetadataSources_クラスがこれを担当します。
MetadataSources metadataSources = new MetadataSources(standardServiceRegistry);
metadataSources.addAnnotatedClass();
metadataSources.addResource()
次に、最後のステップで使用する_Metadata_のインスタンスを取得します。
Metadata metadata = metadataSources.buildMetadata();

* 3.4。 SessionFactory *

最後のステップは、以前に作成された_Metadata:_から_SessionFactory_を作成することです
SessionFactory sessionFactory = metadata.buildSessionFactory();
_Session_を開いて、エンティティの永続化と読み取りを開始できます。
Session session = sessionFactory.openSession();
Movie movie = new Movie(100L);
session.persist(movie);
session.createQuery("FROM Movie").list();

4. 結論

この記事では、_SessionFactory._の構築に必要な手順を調べました。プロセスは複雑に見えますが、3つの主要な手順にまとめることができます。最初に_StandardServiceRegistry_のインスタンスを作成し、次に_Metadata_オブジェクトを構築し、 _SessionFactory._
これらの例の完全なコードは、https://github.com/eugenp/tutorials/tree/master/persistence-modules/hibernate5 [Github上]にあります。