2011-07-21 8 views
2

私は、hibernate.Iを使ってデータベースバックエンドを呼び出すjava Webアプリケーションを開発しています。テスト/デプロイメントのためにサーブレット、jsp、tomcatを使用しています。java -eeの多くの書籍は、本の例(Hibernate Recipes by Gary Mak)の例では、以下のようにジェネリックベースクラスと特定のサブクラスを作成しました。トランザクションを正しく管理するためのDAOクラスの実装

class BaseDao{ 
    private Class persistentClass; 
    public BaseDao(Class persistentClass) { 
     super(); 
     this.persistentClass = persistentClass; 
    } 
    public Object findById(Long id) { 
     SessionFactory factory = HibernateUtil.getSessionFactory(); 
     Session session = factory.openSession(); 
     Object object = null; 
     try { 
      object = (Object) session.get(persistentClass, id); 
      return object; 
     } 
     finally { 
      session.close(); 
     } 
    } 

    @Override 
    public void saveOrUpdate(Object obj) { 
     SessionFactory factory = HibernateUtil.getSessionFactory(); 
     Session session = factory.openSession(); 
     Transaction tx = null; 
     try { 
     tx = session.beginTransaction(); 
     session.saveOrUpdate(obj);   
     tx.commit(); 
     }catch(HibernateException e){ 
      if (tx != null) { 
         tx.rollback(); 

      } 
      throw e; 
     }finally { 
      session.close(); 
     } 

    } 
} 

    class SaleOrderDao extends BaseDao{ 
     public SaleOrderDao() { 
      super(SaleOrder.class); 
     } 
     @Override 
     public SaleOrder findSaleOrderById(Long saleOrderId){    
       SaleOrder so = (SaleOrder)findById(saleOrderId); 
       return so; 

     } 
     @Override 
     public void saveOrUpdateSaleOrder(SaleOrder so){ 

        saveOrUpdate(so); 

      } 

    } 

このフォーラムでの投稿を通過しながら、私はライアン・スチュワートのadviceに出くわしたDAOメソッドでトランザクションを開始および終了することrecommended..Sadlyではないこと、私のプロジェクトは、サポートする任意のWebフレームワークを使用していませんトランザクション管理..そして私はJSP、サーブレットとサーブレットコンテナを使用することに限定されています。

私のDAOの実装を書き換えることができる方法はありますか?トランザクションは適切に管理できます。私が読んだ本から。

ホープ誰かが提案心から

で私を助け、

ジム

+2

春を使用して終了します。そうでなければ、テストされておらず、文書化されていない既製のソリューションを無視して、テストされていないものや文書化されていないものを一緒に束ねる時間を取ることになります。 –

+1

あなたは春を使うことができると仮定して、Nathanがスポットにいます。それ以外に、取引が何であるか理解していますか?私は謙遜にしようとしているわけではありませんが、特にあなたが自分のロールをとろうとする場合は、これを行うことが重要です。ウィキペディアの説明は冗長ですが正確です:http://en.wikipedia.org/wiki/Database_transaction 簡潔に言うと、txnは、すべて通過するか、ロールバックされる必要のある1つ以上のdbクエリです。ある口座から別の口座に口座を振り替える銀行を考えてみましょう。 1つのカウントは借方に記入し、もう1つは貸方に記入する1つの口座から引き落とされたにもかかわらず信用が失われた場合、あなたは「空白」にお金を送ってきました。 – Taylor

+0

コメントありがとう – jimgardener

答えて

9

通常取引はDAOで扱われるべきではありません。サービスレイヤーで処理する必要があります。 1つのサービスメソッドは、すべて同じトランザクション内にある複数のDAO呼び出しを含む場合があります。

スプリング(他のDIフレームワークと同様)では、サービスメソッドに@Transactionalというアノテーションを付けるだけで、これを行うことができます。春がなければ、サービスレイヤーで手動で行うこともできます。

+0

私は質問があります。 3つの異なるmysqlスキーマ用に3つのDAOクラスがあります。すべてが異なるデータソース、セッションファクトリ、トランザクションマネージャを持っています。 1つのトランザクションで3つのスキーマすべてからテーブルを更新する必要があります。これらのDAOコールは、1つのサービスメソッドから作成されます。 3つのトランザクションマネージャをすべてこのサービスメソッドにどのように提供できるかを知ることはできません。私は春と冬眠を使用しています。何か案が ? –

+0

それは別の質問の価値がある – Bozho

+0

ありがとうBozho。別の質問として投稿しますか? –