Spring Data JPAの紹介

Spring Data JPAの紹介

1. 概要

この記事では、introducing Spring Data JPA into a Spring projectと永続層の完全な構成に焦点を当てます。 Javaベースの構成とプロジェクトの基本的なMavenpomを使用したSpringコンテキストのセットアップに関するステップバイステップの紹介については、this article。[more-838]#を参照してください。

2. Spring Dataが生成したDAO–これ以上のDAO実装はありません

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

Spring Dataは、この単純化を一歩前進させ、makes it possible to remove the DAO implementations entirelyにします。 DAOのインターフェイスは、明示的に定義する必要がある唯一のアーティファクトになりました。

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

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

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

説明したように、by implementing one of the Repository interfaces, the DAO will already have some basic CRUD methods (and queries) defined and implemented

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

  • インターフェイスで単にdefine a new method

  • @Queryアノテーションを使用して、実際のJPQ queryを提供します

  • Spring Dataでより高度なSpecification and Querydsl supportを使用する

  • JPA名前付きクエリを介してcustom queriesを定義します

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

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

3.1. 自動カスタムクエリ

Spring Dataは新しいRepository実装を作成するときに、インターフェースによって定義されたすべてのメソッドを分析し、automatically generate queries from the method namesを試行します。 これにはいくつかの制限がありますが、非常に強力でエレガントな方法で、わずかな労力で新しいカスタムアクセス方法を定義できます。

例を見てみましょう。エンティティにnameフィールド(およびJava Bean標準のgetNameおよびsetNameメソッド)がある場合、we’ll define the findByName method in the DAO interface;これにより、正しいクエリが自動的に生成されます。

public interface IFooDAO extends JpaRepository {

   Foo findByName(String name);

}

これは比較的単純な例です。 クエリ作成メカニズムはa much larger set of keywordsをサポートします。

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

java.lang.IllegalArgumentException: No property nam found for type class org.rest.model.Foo

3.2. 手動カスタムクエリ

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

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

名前付きパラメーターの使用や既存のクエリの変更など、クエリの作成をさらにきめ細かく制御するには、the referenceから始めるとよいでしょう。

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

Spring Dataで管理されるDAOの実際の実装は、直接操作しないため、実際には隠されています。 ただし、これは十分に単純な実装です– the SimpleJpaRepository – which defines transaction semantics using annotations

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

4.1. 例外翻訳は健在です

問題は、デフォルトのSpring ORMテンプレート(JpaTemplateHibernateTemplate)を使用していないため、Spring Data JPAを使用することで例外変換が失われるのでしょうか? JPA例外をSpringのDataAccessException階層に変換しませんか?

もちろんそうではありません - exception translation is still enabled by the use of the @Repository annotation on the DAO。 このアノテーションにより、Spring Beanポストプロセッサーは、コンテナー内で見つかったすべてのPersistenceExceptionTranslatorインスタンスを含むすべての@Repository Beanに通知し、以前と同じように例外変換を提供できます。

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

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

exception translation is done through proxies. SpringがDAOクラスの周囲にプロキシを作成できるようにするには、これらをfinalとして宣言してはならないことに注意してください。

5. 春のデータ設定

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

@EnableJpaRepositories(basePackages = "com.example.jpa.dao")
public class PersistenceConfig { ... }

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

6. SpringJavaまたはXML構成

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

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

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

7. Mavenの依存関係

previous articleで定義されたJPAのMaven構成に加えて、spring-data-jpaの依存関係が追加されます。


   org.springframework.data
   spring-data-jpa
   2.1.6.RELEASE

8. Spring Bootを使用する

データソースを自動的に構成するSpring Boot Starter Data JPA依存関係を使用することもできます。

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


   org.springframework.boot
   spring-boot-starter-data-jpa
   2.1.3.RELEASE


    com.h2database
    h2
    1.4.197

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

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

もちろん、独自の明示的な構成を追加することにより、自動構成を変更できます。

Spring Bootは、application.propertiesファイルのプロパティを使用してこれを行う簡単な方法を提供します。

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

この例では、接続URLと認証情報を変更しました。

9. 結論

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

より多くのadvanced custom queriesを定義する方法、およびconfiguration with the new jpa namespaceとトランザクションセマンティクスについて説明しました。 最終的な結果は、実際の実装作業がほとんどない、Springを使用したデータアクセスに関する新しくエレガントな方法です。

このSpringData JPAチュートリアルの実装は、the GitHub projectにあります。