構成

このセクションでは、次のいずれかを使用した Spring Data JPA の構成について説明します。

アノテーションベースの構成

次の例に示すように、Spring Data JPA リポジトリサポートは、JavaConfig とカスタム XML 名前空間の両方を介してアクティブ化できます。

例 1: JavaConfig を使用した Spring Data JPA リポジトリ
@Configuration
@EnableJpaRepositories
@EnableTransactionManagement
class ApplicationConfig {

  @Bean
  public DataSource dataSource() {

    EmbeddedDatabaseBuilder builder = new EmbeddedDatabaseBuilder();
    return builder.setType(EmbeddedDatabaseType.HSQL).build();
  }

  @Bean
  public LocalContainerEntityManagerFactoryBean entityManagerFactory() {

    HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
    vendorAdapter.setGenerateDdl(true);

    LocalContainerEntityManagerFactoryBean factory = new LocalContainerEntityManagerFactoryBean();
    factory.setJpaVendorAdapter(vendorAdapter);
    factory.setPackagesToScan("com.acme.domain");
    factory.setDataSource(dataSource());
    return factory;
  }

  @Bean
  public PlatformTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {

    JpaTransactionManager txManager = new JpaTransactionManager();
    txManager.setEntityManagerFactory(entityManagerFactory);
    return txManager;
  }
}
EntityManagerFactory ではなく LocalContainerEntityManagerFactoryBean を直接作成する必要があります。前者は EntityManagerFactory の作成に加えて例外変換メカニズムにも参加しているためです。

上記の構成クラスは、spring-jdbc の EmbeddedDatabaseBuilder API を使用して、組み込み HSQL データベースをセットアップします。次に、Spring Data は EntityManagerFactory をセットアップし、Hibernate をサンプル永続プロバイダーとして使用します。ここで宣言された最後のインフラストラクチャコンポーネントは JpaTransactionManager です。最後に、この例では、@EnableJpaRepositories アノテーションを使用して Spring Data JPA リポジトリをアクティブ化します。@EnableJpaRepositories アノテーションは、本質的に XML 名前空間と同じ属性を保持します。基本パッケージが構成されていない場合、構成パッケージが存在するパッケージが使用されます。

Spring ネームスペース

Spring Data の JPA モジュールには、リポジトリ Bean を定義できるカスタム名前空間が含まれています。また、JPA に特有の特定の機能と要素属性も含まれています。一般に、次の例に示すように、repositories 要素を使用して JPA リポジトリを設定できます。

例 2: 名前空間を使用して JPA リポジトリを設定する
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:jpa="http://www.springframework.org/schema/data/jpa"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
    https://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/data/jpa
    https://www.springframework.org/schema/data/jpa/spring-jpa.xsd">

  <jpa:repositories base-package="com.acme.repositories" />

</beans>
JavaConfig と XML のどちらが優れていますか ? XML は、Spring がずっと前に構成された方法です。Java、レコード型、アノテーションなどが急速に成長している今日の時代では、通常、新しいプロジェクトではできる限り多くの純粋な Java が使用されます。XML サポートを削除する当面の計画はありませんが、最新の機能の一部は XML で利用できない場合があります。

repositories 要素を使用すると、@Repository アノテーションが付けられたすべての Bean の永続例外変換がアクティブ化され、JPA 永続プロバイダーによってスローされる例外が Spring の DataAccessException 階層に変換されるようになります。

カスタム名前空間属性

repositories 要素のデフォルト属性以外に、JPA 名前空間には追加の属性があり、リポジトリのセットアップをより詳細に制御できます。

表 1: repositories 要素のカスタム JPA 固有の属性

entity-manager-factory-ref

EntityManagerFactory を明示的に接続して、repositories 要素によって検出されるリポジトリで使用します。通常、アプリケーション内で複数の EntityManagerFactory Bean が使用される場合に使用されます。構成されていない場合、Spring Data は、ApplicationContext で entityManagerFactory という名前の EntityManagerFactory Bean を自動的に検索します。

transaction-manager-ref

PlatformTransactionManager を明示的に接続して、repositories 要素によって検出されるリポジトリで使用します。通常、複数のトランザクションマネージャーまたは EntityManagerFactory Bean が構成されている場合にのみ必要です。デフォルトは、現在の ApplicationContext 内の単一の定義済み PlatformTransactionManager です。

Spring Data JPA では、明示的な transaction-manager-ref が定義されていない場合、transactionManager という名前の PlatformTransactionManager Bean が存在する必要があります。

ブートストラップモード

デフォルトでは、Spring Data JPA リポジトリはデフォルトの Spring Bean です。それらはシングルトンスコープであり、先行初期化されます。起動時に、検証およびメタデータ分析のために、すでに JPA EntityManager と対話します。Spring Framework は、バックグラウンドスレッドで JPA EntityManagerFactory の初期化をサポートします。これは、そのプロセスが Spring アプリケーションで通常かなりの量の起動時間を費やしているためです。バックグラウンドの初期化を効果的に使用するには、JPA リポジトリができるだけ遅く初期化されるようにする必要があります。

Spring Data JPA 2.1 以降、次の値を取る BootstrapMode を(@EnableJpaRepositories アノテーションまたは XML 名前空間を介して)構成できるようになりました。

  • DEFAULT (default) — リポジトリは、明示的に @Lazy でアノテーションが付けられていない限り、先行してインスタンス化されます。クライアント Bean がリポジトリ Bean の初期化を必要とするため、リポジトリのインスタンスを必要としない場合にのみ、lazification が有効になります。

  • LAZY — 暗黙的にすべてのリポジトリ Bean を遅延宣言し、また、遅延初期化プロキシを作成してクライアント Bean に注入します。つまり、クライアント Bean がインスタンスをフィールドに単に格納し、初期化中にリポジトリを使用しない場合、そのリポジトリはインスタンス化されません。リポジトリインスタンスは、リポジトリとの最初の対話時に初期化および検証されます。

  • DEFERRED — 基本的に LAZY と同じ動作モードですが、ContextRefreshedEvent にレスポンスしてリポジトリの初期化をトリガーし、アプリケーションが完全に起動する前にリポジトリが検証されるようにします。

推奨

デフォルトのブートストラップモードで非同期 JPA ブートストラップスティックを使用していない場合。

JPA を非同期にブートストラップする場合、DEFERRED は、Spring Data JPA ブートストラップ自体が他のすべてのアプリケーションコンポーネントの初期化よりも時間がかかる場合にのみ EntityManagerFactory セットアップを待機するようにするため、妥当なデフォルトです。それでも、アプリケーションが起動する前に、リポジトリが適切に初期化および検証されるようにします。

LAZY は、シナリオのテストとローカル開発に適した選択肢です。リポジトリが適切にブートストラップできることを確認したら、またはアプリケーションの他の部分をテストしている場合は、すべてのリポジトリに対して検証を実行すると、起動時間が不必要に長くなる可能性があります。同じことが、単一のリポジトリを初期化する必要がある可能性のあるアプリケーションの部分にのみアクセスするローカル開発にも当てはまります。