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ベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。