JPAと春のDAO

JPAとSpringを使用したDAO

1. 概要

この記事では、implement the DAO with Spring and JPAを実行する方法を説明します。 コアJPA構成については、Springを使用したthe article about JPAを参照してください。

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

Spring 3.1以降、JpaTemplateおよび対応するJpaDaoSupporthave beenは非推奨になり、ネイティブJava PersistenceAPIを使用するようになりました。

また、これらのクラスは両方ともJPA 1にのみ関連します(JpaTemplate javadocから):

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

結果として、JpaTemplateではなくuse the Java Persistence API directlyを使用することがベストプラクティスになりました。

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

JpaTemplateの責任の1つは、exception translationでした–低レベルの例外を高レベルの一般的なSpring例外に変換します。

テンプレートがない場合、@Repositoryで注釈が付けられたすべてのDAOのexception translation is still enabled and fully functional。 Springは、コンテナ内で見つかったすべてのPersistenceExceptionTranslatorを含むすべての@RepositoryBeanにアドバイスするBeanポストプロセッサを使用してこれを実装します。

the exception translation mechanism uses proxies – 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 );
   }
}

ここでの主な興味深い側面は、the EntityManager is injectedの方法です–標準の@PersistenceContextアノテーションを使用します。 内部的には、これはPersistenceAnnotationBeanPostProcessorによって処理されます。これは、アノテーションを処理し、containsから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ベースの構成の両方を使用してhow to set up a DAO layer with Spring and JPAを示しました。 また、JpaTemplateを使用しない理由と、EntityManagerに置き換える方法についても説明しました。 最終結果は、Springにコンパイル時の依存がほとんどない、軽量でクリーンなDAO実装です。

この単純なプロジェクトの実装はthe GitHub projectにあります。これはMavenベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。