構成
このセクションでは、次のいずれかを使用した Spring Data JPA の構成について説明します。
“アノテーションベースの構成” (Java 構成)
“Spring ネームスペース” (XML 構成)
アノテーションベースの構成
次の例に示すように、Spring Data JPA リポジトリサポートは、JavaConfig とカスタム XML 名前空間の両方を介してアクティブ化できます。
@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 リポジトリを設定できます。
<?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 名前空間には追加の属性があり、リポジトリのセットアップをより詳細に制御できます。
|
|
|
|
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
は、シナリオのテストとローカル開発に適した選択肢です。リポジトリが適切にブートストラップできることを確認したら、またはアプリケーションの他の部分をテストしている場合は、すべてのリポジトリに対して検証を実行すると、起動時間が不必要に長くなる可能性があります。同じことが、単一のリポジトリを初期化する必要がある可能性のあるアプリケーションの部分にのみアクセスするローカル開発にも当てはまります。