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のより詳しい情報については、下記ページを参照してください。
シェアードデータベースの利用¶
シェアードデータベースに接続するには、以下の設定を行う必要があります。注意
シェアードデータベースを利用する場合、テナント/シェアードそれぞれのリポジトリクラスとエンティティクラスのパッケージを分けて管理してください。
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>
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>
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プロジェクト上で編集・管理してください。