1概要

この記事では、SpringとJPAでDAOを実装する方法を説明します。

コアとなるJPAの設定については、Springの

JPAに関する記事

を参照してください。


2もう春のテンプレートはありません

Spring 3.1以降、

JpaTemplate

および対応する

JpaDaoSupport

** は、ネイティブのJava Persistence APIを使用するために非推奨になりました。

また、これらのクラスは両方とも(

JpaTemplate

javadocからの)JPA 1にのみ関連しています。

このクラスはJPA 2.0にアップグレードされず、決してアップグレードされないことに注意してください。

結果として、

JpaTemplate

ではなく

Java Persistence APIを直接

使用することがベストプラクティスになりました。

====

2.1. テンプレートなしの例外翻訳


JpaTemplate

の責務の1つは

例外変換

– 低レベルの例外をより高レベルの汎用Spring例外に変換することでした。

テンプレートがなくても、

@ Repository

のアノテーションが付けられたすべてのDAOに対して** 例外変換は引き続き有効で完全に機能します。 Springはこれをコンテナにあるすべての

PersistenceExceptionTranslator

を持つすべての

@ Repository

Beanに通知するBeanポストプロセッサで実装します。

例外変換メカニズムはプロキシを使用することに注意することも重要です – SpringがDAOクラスの周りにプロキシを作成できるようにするために、これらは


final


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

===

3.


DAO

まず、すべてのDAOの基本層、つまりジェネリックを使用した拡張クラスを実装します。

public abstract class AbstractJpaDAO< T extends Serializable > {

   private Class< T > clazz;

   @PersistenceContext
   EntityManager entityManager;

   public final void setClazz( Class< T > clazzToSet ){
      this.clazz = clazzToSet;
   }

   public T findOne( long id ){
      return entityManager.find( clazz, id );
   }
   public List< T > findAll(){
      return entityManager.createQuery( "from " + clazz.getName() )
       .getResultList();
   }

   public void create( T entity ){
      entityManager.persist( entity );
   }

   public T update( T entity ){
      return entityManager.merge( entity );
   }

   public void delete( T entity ){
      entityManager.remove( entity );
   }
   public void deleteById( long entityId ){
      T entity = findOne( entityId );
      delete( entity );
   }
}

ここでのおもなおもしろい点は、


EntityManager

のインジェクション

– 標準の

@ PersistenceContext

アノテーションを使うことです。内部的には、これは

PersistenceAnnotationBeanPostProcessor

によって処理されます。これはアノテーションを処理し、コンテナからJPAエンティティマネージャを取得してそれを挿入します。

永続化ポストプロセッサは、設定で定義することによって明示的に作成されるか、ネームスペース設定で

context:annotation-config

または

context:component-scan

を定義することによって自動的に作成されます。

また、エンティティ


Class


は、総称演算で使用するためにコンストラクタに渡されます。

@Repository
public class FooDAO extends AbstractJPADAO< Foo > implements IFooDAO{

   public FooDAO(){
      setClazz(Foo.class );
   }
}

===

4結論

このチュートリアルでは、XMLベースとJavaベースの両方の設定を使用して、SpringとJPAでDAO層を設定する方法を説明しました。また、

JpaTemplate

を使用しない理由と、それを

EntityManager

で置き換える方法についても説明しました。最終的な結果は、コンパイル時にSpringにほとんど依存しない、軽量でクリーンなDAO実装です。

この単純なプロジェクトの実装はhttps://github.com/eugenp/tutorials/tree/master/persistence-modules/spring-jpa[GitHubプロジェクト]にあります – これはMavenベースのプロジェクトです。そのままインポートして実行するのは簡単です。