SpringとHibernateのDAO

SpringとHibernateを備えたDAO

1. 概要

この記事では、implement the DAO with Spring and Hibernateを実行する方法を説明します。 コアHibernate構成については、前のHibernate 5 with Springの記事を確認してください。

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

Spring3.0およびHibernate3.0.1以降、Hibernateセッションを管理するためのthe Spring HibernateTemplate is no longer necessarycontextual sessionssessions managed directly by Hibernateを利用して、トランザクションの範囲全体でアクティブにすることが可能になりました。

結果として、HibernateTemplate.の代わりにHibernate APIを直接使用することがベストプラクティスになりました。これにより、DAOレイヤーの実装がSpringから完全に分離されます。

2.1. HibernateTemplateなしの例外変換

例外変換はHibernateTemplateの責任の1つであり、低レベルのHibernate例外をより高レベルの一般的なSpring例外に変換します。

テンプレートがない場合、this mechanism is still enabled and activefor all the DAOs annotated with the @Repository注釈。 内部的には、これはSpring Beanポストプロセッサを使用して、Springコンテキストで見つかったすべてのPersistenceExceptionTranslatorを含むすべての@RepositoryBeanにアドバイスします。

覚えておくべきことの1つは、例外変換ではプロキシが使用されることです。 SpringがDAOクラスの周りにプロキシを作成できるようにするには、これらをfinalとして宣言してはなりません。

2.2. テンプレートを使用しないHibernateセッション管理

コンテキストセッションのHibernateサポートが発表されたとき、HibernateTemplateは本質的に廃止されました。 実際、クラスのJavadocはこの側面を強調しています(元の部分から太字になっています)。

Note
Hibernate 3.0.1以降、トランザクションHibernateアクセスコードもプレーンなHibernateスタイルでコーディングできます。 したがって、新しく開始されたプロジェクトでは、\ {@ link org.hibernate.SessionFactory#getCurrentSession()}に基づいて、データアクセスオブジェクトをコーディングする標準のHibernate3スタイルを採用することを検討してください。

3. DAO

一般的な一般的な操作をサポートし、エンティティごとに拡張できるthe base DAO – an abstract, parametrized DAOから始めます。

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

   @Autowired
   private SessionFactory sessionFactory;

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

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

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

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

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

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

ここで興味深い点がいくつかあります。前述のように、抽象DAOはSpringテンプレート(HibernateTemplateなど)を拡張しません。 代わりに、HibernateSessionFactoryはDAOに直接注入され、公開されるコンテキストSessionを通じて、メインのHibernateAPIの役割を果たします。

this.sessionFactory.getCurrentSession();

また、コンストラクターは、汎用操作で使用されるパラメーターとしてエンティティーのClassを受け取ることに注意してください。

ここで、Fooエンティティのan example implementation of this DAOを見てみましょう。

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

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

4. 結論

この記事では、HibernateおよびSpringを使用した永続化レイヤーの構成と実装について説明しました。

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

この単純なプロジェクトの実装は、the github projectにあります。