intra-mart Accel Platform / TERASOLUNA Global Framework プログラミングガイド

第5版 2014-09-01

コンテンツ

Spring Data JPAを使用したプログラミング方法

概要

ここでは、Spring Data JPAを使用したプログラミング方法の一例を紹介します。
仕様などの詳しい情報については下記を参照してください。

Spring Data JPAについて

JPA(Java Persistence API)とは永続化に関する仕様であり、Spring Data JPAはこれをサポートしたO/Rマッピングフレームワークです。
Spring Data JPAを使用すると、Queryメソッドと呼ばれるメソッドをRepositoryインタフェースに定義するだけで、指定した条件に一致するEntityを取得することが出来るため、Entityの操作を行うための実装を減らすことができます。

設定

JPAの機能を利用するにあたり、予めエンティティクラスをJPAの管理対象に設定しておく必要があります。
applicationContext-im_tgfw_jpa.xml を開き、下記箇所のvalue属性をエンティティクラスのルートパッケージに設定します。
            <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
                    <property name="packagesToScan" value="my.terasoluna.app.domain.entity" />
                    <property name="jtaDataSource" ref="dataSource" />
                    <property name="jpaVendorAdapter" ref="jpaVendorAdapter" />
                    <property name="jpaPropertyMap" ref="hibernateProperties" />
                    <property name="persistenceUnitName" value="tenant" />
            </bean>

コラム

applicationContext-im_tgfw_jpa.xml はテナントで共通の設定ファイルとなります。通常Jugglingプロジェクトにて編集するファイルです。複数のエンティティクラスのルートパッケージを登録する場合はカンマ区切りで設定してください。

コラム

エンティティの生成方法については Eclipseからエンティティを生成 を参照してください。
また、モジュール・プロジェクト内の任意のappliationContext.xmlに以下のようにリポジトリクラスのルートパッケージを指定する必要があります。
<jpa:repositories base-package="my.terasoluna.app.domain.repository" />

リポジトリクラスの作成

JpaRepositoryを利用した実装の場合、以下のようにJpaRepositoryを継承したインタフェースを定義します。
ジェネリクスの第一引数にエンティティクラス、第二引数に主キーのフィールド型を指定します。
package my.terasoluna.app.domain.repository;

import my.terasoluna.app.domain.model.MyCompany;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface MyCompanyRepository extends JpaRepository<MyCompany, String> {

}
JpaRepositoryには予め主要な処理が実装されています。インタフェースの仕様については下記APIリストを参照してください。
また、インタフェースを利用しない場合、下記のように@RepositoryDefinitionを定義し、domainClassにエンティティ、idClassに主キーの型を設定します。
import org.springframework.data.repository.RepositoryDefinition;

...

@RepositoryDefinition(domainClass=MyCompany.class, idClass=String.class)
public interface MyCompanyRepositoryNoSuper {

  public void save(MyCompany entity);
  public void delete(MyCompany entity);
  public MyCompany findOne(String companyId);
  ...
このとき、メソッド名は後述の「メソッドシグネチャ」に従い定義してください。

クエリメソッド

Queryメソッドは、Entity毎のRepositoryインタフェースのメソッドとして定義します。
使用するクエリは主に下記2種類の方法で指定します。

メソッドシグネチャ

ある特定のネーミングルールに従いメソッド名を定義すると、Spring Data JPAの機能によってメソッド名から実行するQuery(JPQL)が生成されます。
※SELECT文のみサポート
List<User> findByEmailAddressAndLastname(String emailAddress, String lastname);
  • 上記のようなメソッド名を定義した場合、実行されるJPQLは以下のようになります。
select u from User u where u.emailAddress = ?1 and u.lastname = ?2

Queryアノテーション

  • メソッド実行時のJPQLを明示指定する場合、以下のように@Queryアノテーションを利用します。
@Query("select u from User u where u.emailAddress = ?1")
User findByEmailAddress(String emailAddress);

コラム

クエリメソッドのより詳しい情報については、下記ページを参照してください。

ページネーション

Spring Data JPAでページング機能を実現するには、PageRequestを使用します。
import static org.springframework.data.domain.Sort.Direction.ASC;
import static org.springframework.data.domain.Sort.Direction.DESC;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;

...

    public List<MyCompany> fetch(int page, int pageSize) {
        Pageable pageable = new PageRequest(page, pageSize, ASC, "id");
        return myCompanyRepository.findAll(pageable).getContent();
    }

コラム

PageRequestのより詳しい情報については、下記ページを参照してください。

シェアードデータベースの利用

シェアードデータベースに接続するには、以下の設定を行う必要があります。

注意

シェアードデータベースを利用する場合、テナント/シェアードそれぞれのリポジトリクラスとエンティティクラスのパッケージを分けて管理してください。
  1. applicationContext-im_tgfw_common.xml の sharedDataSourceのコメントアウトを外します。
    このとき、connectIdに対象シェアードデータベースの接続IDを指定します。
<bean id="dataSource"   class="jp.co.intra_mart.framework.extension.spring.datasource.TenantDataSource" />

<bean id="sharedDataSource" class="jp.co.intra_mart.framework.extension.spring.datasource.SharedDataSource">
  <constructor-arg name="connectId" value="sharedA" />
</bean>
  1. applicationContext-im_tgfw_jpa.xml のsharedEntityManagerFactoryのコメントアウトを外します。
    このとき、packagesToScanにシェアードデータベースのエンティティクラスのパッケージを指定します。
<bean id="sharedEntityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
  <property name="persistenceUnitName" value="shared" />
  <property name="packagesToScan" value="sample.spring.domain.model.shared" />
  <property name="jtaDataSource" ref="sharedDataSource" />
  <property name="jpaVendorAdapter" ref="jpaVendorAdapter" />
  <property name="jpaPropertyMap" ref="hibernateProperties" />
</bean>
  1. Spring Data JPAがスキャンするリポジトリのパッケージを下記のように使用するデータベース毎に定義します。
    このとき、entity-manager-factory-ref属性を明示的に指定する必要があります。
    <jpa:repositories base-package="sample.spring.domain.repository.tenant" entity-manager-factory-ref="entityManagerFactory" />
    <jpa:repositories base-package="sample.spring.domain.repository.shared" entity-manager-factory-ref="sharedEntityManagerFactory" />
    

コラム

Jugglingプロジェクトの「追加リソースの選択」から「TERASOLUNA Global Framework for JPA設定ファイル」を選択すると
上記ファイルを含む設定ファイルがJugglingプロジェクト上に配置されます。
モジュールプロジェクト上に上記編集ファイルを配置すると他のモジュールに影響を与える可能性があります。
そのため上記ファイルは必ず、モジュール・プロジェクト上に配置するのではなく、Jugglingプロジェクト上で編集・管理してください。

コンテンツ