1概要

この記事では、SpringとHibernateを使ってDAOを実装する方法を説明します。 Hibernateのコア設定については、

Hibernate 3

および

Hibernate 4

に関する記事をSpringで参照してください。


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

Spring 3.0とHibernate 3.0.1以降、Hibernateセッションを管理するためにSpring

HibernateTemplate

は必要なくなりました。

contextual sessions



直接管理されるセッションを利用することが可能になりましたHibernate

により、トランザクションの範囲全体にわたってアクティブになります。

その結果、

HibernateTemplate

ではなくHibernate APIを直接使用することがベストプラクティスになりました。これにより、DAOレイヤの実装が完全にSpringから切り離されます。


2.1.

HibernateTemplate

を使わないで例外の翻訳 – 生きているとよく

例外の翻訳は

HibernateTemplate

の責任の1つでした – 低レベルのHibernate例外をより高レベルの一般的なSpring例外に変換することです。

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

@ Repository

アノテーションが付けられたすべてのDAOに対して

このメカニズムは有効かつ有効です

。内部的には、これはSpringのコンテキストで見つかったすべての

PersistenceExceptionTranslator

を持つすべての

@ Repository

BeanをアドバイスするSpring beanポストプロセッサを使用します。

覚えておくべきことの1つは、例外の変換はプロキシを介して行われることです。 SpringがDAOクラスの周りにプロキシを作成できるようにするためには、これらを


final


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


2.2. テンプレートを使用しないHibernate Session管理

Hibernateがコンテキストセッションをサポートするようになったとき、

HibernateTemplate

は本質的に時代遅れになりました。実際、クラスのJavadocはこのアドバイスで更新されています(元のものから太字)。

注:Hibernate 3.0.1以降では、トランザクションHibernateアクセスコードもプレーンなHibernateスタイルでコード化することができます。したがって、新しく開始したプロジェクトでは、代わりに標準のHibernate 3スタイルのデータアクセスオブジェクトのコーディングを採用することを検討してください。

===

3 DAO

基本的なDAOから始めましょう。

抽象的でパラメータ化されたDAO

。これは一般的な一般的な操作をサポートし、各エンティティに対して拡張されることを意図しています。

public abstract class AbstractHibernateDAO< T extends Serializable >{
   private Class< T > clazz;

   @Autowired
   private SessionFactory sessionFactory;

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

   public T findOne( final long id ){
      return (T) getCurrentSession().get( clazz, id );
   }
   public List< T > findAll(){
      return getCurrentSession()
       .createQuery( "from " + clazz.getName() ).list();
   }

   public void save( final T entity ){
      getCurrentSession().persist( entity );
   }

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

   public void delete( final T entity ){
      getCurrentSession().delete( entity );
   }
   public void deleteById( final long id ){
      final T entity = findOne( id);
      delete( entity );
   }

   protected final Session getCurrentSession(){
      return sessionFactory.getCurrentSession();
   }
}

ここで興味深い点がいくつかあります – 説明したように、抽象DAOはSpringテンプレート(

HibernateTemplate

など)を拡張しません。代わりに、Hibernate

SessionFactory

がDAOに直接注入され、公開されているコンテキスト

Session

を通じてメインのHibernate APIの役割を持ちます。


this.sessionFactory。

getCurrentSession

();

また、エンティティの


Class


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

それでは、

Foo

エンティティについて、このDAO ** の実装例を見てみましょう。

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

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

===

4結論

この記事では、XMLベースとJavaベースの両方の構成を使用した、HibernateとSpring 4による持続性層の構成と実装について説明しました。

DAO層のテンプレートに頼るのをやめる理由と、トランザクションとHibernateセッションを管理するためにSpringを設定する際の落とし穴について説明しました。最終的な結果は、コンパイル時にSpringにほとんど依存しない、軽量でクリーンなDAO実装です。

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