JPAとSpringを使用したDAO
1. 概要
この記事では、SpringとJPAを使用してDAOを実装する方法を示します。 コアJPA構成については、Springを使用したJPAに関する記事を参照してください。
2. これ以上の春のテンプレートはありません
Spring 3.1以降、JpaTemplateおよび対応するJpaDaoSupport
また、これらのクラスは両方ともJPA 1( JpaTemplate javadocから)にのみ関連しています。
このクラスはJPA2.0にアップグレードされておらず、アップグレードされないことに注意してください。
結果として、JpaTemplateの代わりにJavaPersistenceAPIを直接使用することがベストプラクティスになりました。
2.1. テンプレートなしの例外翻訳
JpaTemplate の責任の1つは、例外変換 –低レベルの例外をより高レベルの一般的なSpring例外に変換することでした。
テンプレートがなくても、例外変換は引き続き有効であり、@Repositoryで注釈が付けられたすべてのDAOに対して完全に機能します。 Springは、コンテナ内にあるすべてのPersistenceExceptionTranslatorを含むすべての@RepositoryBeanに通知する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 によって処理されます。これは、アノテーションを処理し、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ベースの構成の両方を使用して、SpringとJPAでDAOレイヤーをセットアップする方法を説明しました。 また、 JpaTemplate を使用しない理由と、EntityManagerに置き換える方法についても説明しました。 最終的な結果は、Springにコンパイル時の依存がほとんどない、軽量でクリーンなDAO実装です。
この単純なプロジェクトの実装は、 GitHubプロジェクトにあります。これはMavenベースのプロジェクトであるため、そのままインポートして実行するのは簡単です。