2011-06-22 22 views

答えて

2

一般的には、DAOで特定の例外を処理するかどうかによって異なります。ただし、特定の例では、セッションがフラッシュされない可能性があり、その結果、(制約違反のような)面白い例外は得られません。だから私は、彼らが伝播するよりも、それを捉える方が意味がないと言っています。しかし、堅いルールはありません。

+0

アレックスが言うように。セッションがコミットまたはロールバックされ、通常はどこかで閉じられていることを確認する必要があります。あなたは何を望むかによって決まります。 – MJB

1

org.hibernate.Session.saveOrUpdateがHibernateExceptionをスローするので、例外をキャッチすることをお勧めします。しかし、もしあなたがそれが失敗した場合にロールバックできるようにすることができれば、try/catchブロックでトランザクション全体を行うことをお勧めします。ここでこれを行うための一般的なイディオムです:

Session sess = factory.openSession(); 
Transaction tx; 
try { 
    tx = sess.beginTransaction(); 
    //do some work 
    //(your call to saveOrUpdate() would go in here somewhere) 
    ... 
    tx.commit(); 
} 
catch (Exception e) { 
    if (tx!=null) tx.rollback(); 
    throw e; 
} 
finally { 
    sess.close(); 
} 

あなたはより多くの情報hereを見つけて、より一般的には約hereを休止状態にすることができます。

+0

私はSpring 3を使用しており、 ''はコミットとロールバックを処理すると思いますが、それはありませんか? – Rihards

0

使用できるパターンがいくつかあります。

最も簡単なのはthrows Exceptionと宣言するだけですが、Exceptionを投げることは非常に劣っています。実際には、villanはHibernateです - そのメソッドはExceptionより狭いものを投げて宣言する必要があります。例えばMyDatabaseException

  • キャッチは、あなたのドメイン例外
  • に包まれた例外を再スローすることをスローするようにあなたの方法を宣言し、

    1. は、「ドメインの例外」を定義します。

      良い方法にありますこのよう

    public void save(Inventory object) throws MyDatabaseException { 
        try { 
         factory.getCurrentSession().saveOrUpdate(object); 
        } catch (Exception e) { 
         throw new MyDatabaseException(e); 
        } 
    } 
    

    この第2のアプローチは、よく使用されるパターンです。

    P.S.これを@ Sethのtry-catch-finallyの良いアイデアと組み合わせると、より良いアプローチが得られます。

    +0

    ありがとう! MyDatabaseException例外をどこで処理すべきですか? – Rihards

    0

    私たちの設計は、再試行する必要があるかどうかを知ることができ、次に何をするべきかを知っているので、処理するビジネスロジックコードにtryとcatch例外をさせることです。 DAOクラスはすべての例外をキャッチしてビジネスロジックコードにスローし、データベースの無駄な部分のみに集中します。だから、DAOクラスは将来も常に再利用可能です。

    関連する問題