データ]

  • リンク:/tag/jpa/[JPA]


目次

実装]




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


1概要

この記事では、Spring 4プロジェクトへのSpring Data JPAの導入と、永続層の完全な構成に焦点を当てます。 Javaベースの設定とプロジェクトのための基本的なMaven pomを使ってSpringコンテキストを設定することについての段階的な紹介については、リンクを見てください:記事]。

** 2 Spring DataがDAOを生み出した – これ以上のDAO実装

以前の記事で説明したように、

DAO層

は通常、

単純化することができ、単純化する必要がある

多数の定型コードで構成されます。 。このような単純化の利点はたくさんあります。

定義および維持する必要がある成果物の数、データアクセスパターンの一貫性、および設定の一貫性の減少。

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

JPAでSpring Dataプログラミングモデルを活用するためには、DAOインタフェースはJPA固有の

Repository

インタフェース –

JpaRepository

を拡張する必要があります。これにより、Spring Dataはこのインタフェースを見つけて自動的に実装を作成することができます。

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


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

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

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

  • 単に

    インターフェースで新しいメソッドを定義する


  • @ Query

    アノテーションを使って

    実際の

    JPQクエリ** を提供する

  • Springで

    より高度な

    SpecificationとQuerydslのサポートを使う

データ
JPA名前付きクエリを介した

カスタム

クエリの定義**


third option

– 仕様とQuerydslのサポート – はJPA Criteriaと似ていますが、より柔軟で便利なAPI – 操作全体をはるかに読みやすく再利用可能にします。このAPIの利点は、さまざまな組み合わせで発生し続ける少数の再利用可能なブロックによって潜在的により簡潔に表現される可能性のある多数の固定クエリを処理するときに、より顕著になります。

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


3.1. 自動カスタムクエリ

Spring Dataが新しい

Repository

実装を作成するとき、それはインタフェースによって定義されたすべてのメソッドを分析し、

メソッド名から

自動的にクエリを生成しようとします** 。これにはいくつかの制限がありますが、それは非常に少ない労力で新しいカスタムアクセスメソッドを定義するための非常に強力でエレガントな方法です。

例を見てみましょう。管理対象エンティティに

name

フィールド(およびJava Bean標準の

getName

メソッドと

setName

メソッド)がある場合は、DAOインタフェースで


findByName

メソッド

を定義します。これは自動的に正しい問い合わせを生成します。

public interface IFooDAO extends JpaRepository< Foo, Long >{

   Foo findByName( String name );

}

これは比較的単純な例です。

より多くのキーワードのセット

はクエリでサポートされています作成メカニズム

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

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);

名前付きパラメーターの使用や既存の照会の変更など、照会の作成をさらにきめ細かく制御するには、http://static.springsource.org/spring-data/data-jpa/docs/1.1.x/reference/htmlを使用してください。/#jpa.named-parameters[the reference]から始めるのが良いでしょう。

** 4トランザクション設定

**

Spring Dataによって管理されているDAOの実際の実装は、私たちが直接それを使って作業していないので、実際には隠されています。ただし、これは十分に単純な実装である

SimpleJpaRepository

– アノテーションを使用してトランザクションセマンティクスを定義します。

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

** 4.1. 例外翻訳は生きていてまあまあ

**

問題は、デフォルトのSpring ORMテンプレート(

JpaTemplate



HibernateTemplate

)を使用していないため、Spring Data JPAを使用して

例外変換を失うことになるかどうかです。

– JPA例外をSpringの

DataAccessException

階層に変換する予定はありません。 ?

もちろん、DAOの

@ Repository

アノテーションを使用することで、例外の翻訳が可能になります。このアノテーションにより、Spring Beanのポストプロセッサは、コンテナ内にあるすべての

PersistenceExceptionTranslator

インスタンスを持つすべての

@ Repository

Beanをアドバイスし、以前と同様に例外変換を提供できます。

例外変換が実際に有効であるという事実は、

統合テスト

で簡単に検証できます。

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

SpringがDAOクラスの周りにプロキシを作成できるようにするためには、これらは


final


として宣言してはいけません。


5 Spring Data Configuration

Spring JPAリポジトリのサポートをXML設定で有効にするには、


jpa

名前空間

を使用して、DAOインタフェースが配置されるパッケージを指定します。

<?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
      http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
      http://www.springframework.org/schema/data/jpa
      http://www.springframework.org/schema/data/jpa/spring-jpa.xsd">

<jpa:repositories base-package="org.rest.dao.spring"/>

</beans>


Spring Data 1.4から始める

、Javaのみの設定でも同じことができます。

@EnableJpaRepositories(basePackages = "org.baeldung.persistence.dao")
public class PersistenceConfig { ... }


6. Spring JavaまたはXMLの設定

前の記事で、どのようにリンクするのかについて詳しく説明しました。また、Spring Dataは、

EntityManager

を実際のDAO実装の作成を担当するSpringファクトリBean –

JpaRepositoryFactoryBean

に関連付けるために使用するJPA

@ PersistenceContext

アノテーションのSpringサポートも利用します。

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

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


7. Mavenの依存関係

リンクで定義されたJPA用のMaven構成//春とjpaを持つ永続層[前の記事]に、

spring-data-jpa

依存関係が追加されています。

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


8結論

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

より高度なカスタムクエリを定義するさまざまな方法と、新しい

jpa

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

このSpring Data JPAチュートリアルの実装はhttps://github.com/eugenp/tutorials/tree/master/spring-rest-full[GitHubプロジェクト]にあります – これはMavenベースのプロジェクトなので、すべきです。そのままインポートして実行するのは簡単です。