1. 概要

このチュートリアルでは、 SpringDataJPAをSpringプロジェクトに導入すると永続層を完全に構成することに焦点を当てます。 Javaベースの構成とプロジェクトの基本的なMavenpomを使用してSpringコンテキストをセットアップするためのステップバイステップの概要については、この記事を参照してください。

2. Springデータで生成されたDAO–これ以上のDAO実装はありません

以前の記事で説明したように、 DAOレイヤーは通常、簡略化できる、または簡略化する必要のある多くの定型コードで構成されています。 このような単純化の利点は数多くあります。定義および維持する必要のあるアーティファクトの数の減少、データアクセスパターンの一貫性、および構成の一貫性です。

Spring Dataは、この単純化をさらに一歩進め、により、DAO実装を完全に削除することができます。 DAOのインターフェースは、明示的に定義する必要がある唯一のアーティファクトになりました。

Spring DataプログラミングモデルをJPAで活用し始めるには、DAOインターフェースがJPA固有のRepositoryインターフェースJpaRepositoryを拡張する必要があります。 これにより、Spring Dataはこのインターフェースを見つけて、その実装を自動的に作成できるようになります。

インターフェイスを拡張することで、標準のDAOで利用可能な標準のデータアクセスに最も関連性の高いCRUDメソッドを取得できます。

3. カスタムアクセス方法とクエリ

説明したように、リポジトリインターフェイスの1つを実装することにより、DAOにはすでにいくつかの基本的なCRUDメソッド(およびクエリ)が定義および実装されています

より具体的なアクセス方法を定義するために、SpringJPAはかなりの数のオプションをサポートしています。

  • 単にインターフェースで新しいメソッドを定義する
  • @Query アノテーションを使用して、実際のJPQLクエリを提供します
  • SpringDataでより高度な仕様とQuerydslサポートを使用する
  • JPA名前付きクエリを介してカスタムクエリを定義する

3番目のオプション、仕様およびQuerydslサポートは、JPA基準に似ていますが、より柔軟で便利なAPIを使用します。 これにより、操作全体がはるかに読みやすく、再利用可能になります。 このAPIの利点は、多数の固定クエリを処理するときにさらに顕著になります。これは、少数の再利用可能なブロックを介してこれらをより簡潔に表現できる可能性があるためです。

最後のオプションには、XMLが含まれるか、ドメインクラスにクエリを負担させるという欠点があります。

3.1. 自動カスタムクエリ

Spring Dataが新しいリポジトリ実装を作成すると、インターフェイスによって定義されたすべてのメソッドを分析し、メソッド名からクエリを自動的に生成しようとします。 これにはいくつかの制限がありますが、非常に強力でエレガントな方法で、わずかな労力で新しいカスタムアクセスメソッドを定義できます。

例を見てみましょう。 エンティティにnameフィールド(およびJavaBean標準のgetNameおよびsetName メソッド)がある場合、でfindByNameメソッドを定義します。 DAOインターフェース。これにより、正しいクエリが自動的に生成されます。

public interface IFooDAO extends JpaRepository<Foo, Long> {

    Foo findByName(String name);

}

これは比較的単純な例です。 クエリ作成メカニズムは、はるかに多くのキーワードセットをサポートします。

パーサーがプロパティをドメインオブジェクトフィールドと一致させることができない場合、次の例外が表示されます。

java.lang.IllegalArgumentException: No property nam found for type class com.baeldung.spring.data.persistence.model.Foo

3.2. 手動カスタムクエリ

次に、@Queryアノテーションを介して定義するカスタムクエリを見てみましょう。

@Query("SELECT f FROM Foo f WHERE LOWER(f.name) = LOWER(:name)")
Foo retrieveByName(@Param("name") String name);

名前付きパラメーターの使用や既存のクエリの変更など、クエリの作成をさらにきめ細かく制御するには、参照から始めるのが適切です。

4. トランザクション構成

Springが管理するDAOの実際の実装は、直接操作しないため、実際には隠されています。 ただし、これは十分に単純な実装であり、 SimpleJpaRepositoryであり、アノテーションを使用してトランザクションセマンティクスを定義します。

より明確に言えば、これはクラスレベルで読み取り専用の @Transactional アノテーションを使用します。このアノテーションは、非読み取り専用のメソッドでオーバーライドされます。 残りのトランザクションセマンティクスはデフォルトですが、これらはメソッドごとに手動で簡単にオーバーライドできます。

4.1. 例外翻訳は健在です

問題は次のようになります。SpringDataJPAは古いORMテンプレート( JpaTemplate HibernateTemplate )に依存せず、Spring 5以降削除されているため、引き続きJPA例外をSpringのDataAccessException階層に変換しますか?

もちろん、その答えは私たちです。 DAO で@Repositoryアノテーションを使用すると、例外変換が引き続き有効になります。 このアノテーションにより、Spring Beanポストプロセッサーは、コンテナー内にあるすべての PersistenceExceptionTranslator インスタンスについて、すべての @Repository Beanに通知し、以前と同じように例外変換を提供できます。

統合テストで例外変換を検証しましょう。

@Test(expected = DataIntegrityViolationException.class)
public void whenInvalidEntityIsCreated_thenDataException() {
    service.create(new Foo());
}

例外変換はプロキシを介して行われることに注意してください。SpringがDAOクラスの周囲にプロキシを作成できるようにするには、これらをfinalと宣言しないでください。

5. SpringDataJPAリポジトリー構成

Spring JPAリポジトリーのサポートをアクティブ化するには、 @EnableJpaRepositories アノテーションを使用して、DAOインターフェースを含むパッケージを指定します。

@EnableJpaRepositories(basePackages = "com.baeldung.spring.data.persistence.repository") 
public class PersistenceConfig { 
    ...
}

XML構成でも同じことができます。

<jpa:repositories base-package="com.baeldung.spring.data.persistence.repository" />

6. JavaまたはXML構成

前回の記事で、SpringJPAを構成する方法についてはすでに詳しく説明しました。 Spring Dataは、JPA @PersistenceContextアノテーションに対するSpringのサポートも利用します。 これを使用して、EntityManagerを実際のDAO実装の作成を担当するSpringファクトリBeanJpaRepositoryFactoryBeanにワイヤリングします。

すでに説明した構成に加えて、XMLを使用している場合は、Spring DataXMLConfigも含める必要があります。

@Configuration
@EnableTransactionManagement
@ImportResource("classpath*:*springDataConfig.xml")
public class PersistenceJPAConfig {
    ...
}

7. Mavenの依存関係

前の記事のように、JPAのMaven構成に加えて、spring-data-jpa依存関係を追加します。

<dependency>
   <groupId>org.springframework.data</groupId>
   <artifactId>spring-data-jpa</artifactId>
   <version>2.4.0</version>
</dependency>

8. スプリングブートの使用

Spring Boot Starter Data JPA 依存関係を使用して、DataSourceを自動的に構成することもできます。

使用するデータベースがクラスパスに存在することを確認する必要があります。 この例では、H2インメモリデータベースを追加しました。

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-jpa</artifactId>
   <version>2.7.2</version>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.200</version>
</dependency>

その結果、これらの依存関係を実行するだけで、アプリケーションが稼働し、他のデータベース操作に使用できるようになります。

標準のSpringアプリケーションの明示的な構成が、SpringBootの自動構成の一部として含まれるようになりました。

もちろん、カスタマイズした明示的な構成を追加することで、自動構成を変更できます。

Spring Bootは、application.propertiesファイルのプロパティを使用してこれを行う簡単な方法を提供します。 接続URLとクレデンシャルを変更する例を見てみましょう。

spring.datasource.url=jdbc:h2:mem:db;DB_CLOSE_DELAY=-1
spring.datasource.username=sa
spring.datasource.password=sa

9. SpringDataJPAに役立つツール

Spring Data JPAは、すべての主要なJavaIDEでサポートされています。 EclipseとIntelliJIDEAで利用できる便利なツールを見てみましょう。

EclipseをIDEとして使用する場合は、Dali Java Persistence Toolsプラグインをインストールできます。これにより、JPAエンティティのERダイアグラム、スキーマを初期化するためのDDL生成、および基本的なリバースエンジニアリング機能が提供されます。 また、Eclipse Spring Tool Suite(STS)を使用することもできます。 SpringDataJPAリポジトリのクエリメソッド名を検証するのに役立ちます。

IntelliJ IDEAを使用する場合、2つのオプションがあります。

IntelliJ IDEA Ultimateは、ERダイアグラム、JPQLステートメントをテストするためのJPAコンソール、および貴重な検査を可能にします。 ただし、これらの機能はCommunityEditionでは使用できません。

IntelliJの生産性を高めるために、JPA Buddyプラグインをインストールできます。は、JPAエンティティの生成、Spring Data JPAリポジトリ、DTO、初期化DDLスクリプト、Flywayバージョンの移行、Liquibase変更ログなどの多くの機能を提供します。 。 また、JPA Buddyは、リバースエンジニアリングのための高度なツールを提供します。

最後に、JPA Buddyプラグインは、CommunityエディションとUltimateエディションの両方で機能します。

10. 結論

この記事では、XMLとJavaベースの構成の両方を使用して、Spring 5、JPA 2、およびSpring Data JPA(Spring Dataアンブレラプロジェクトの一部)を使用した永続化レイヤーの構成と実装について説明しました。

より多くの高度なカスタムクエリトランザクションセマンティクス、および新しいjpa名前空間を使用した構成を定義する方法について説明しました。 最終的な結果は、Springを使用したデータアクセスの新しくエレガントなテイクであり、実際の実装作業はほとんどありません。

このSpringDataJPAチュートリアルの実装は、GitHubプロジェクトにあります。