SpringとHibernateのDAO

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