0

以下のようなtry-catchブロックでDAOのsaveOrUpdateまたはdeleteを常に囲む必要がありますか?Session

public void save(Inventory object) {
    try {
        factory.getCurrentSession().saveOrUpdate(object);
    } catch (Exception e) {
        _logger.error("Cannot save or update object " + object, e);
    }
}
4

4 に答える 4

2

通常、DAOで特定の例外を処理するかどうかによって異なります。ただし、特定の例では、セッションがフラッシュされない可能性があり、その結果、とにかく興味深い例外(制約違反など)が発生しないことに注意してください。ですから、繁殖させるよりも捕まえる方が理にかなっていると思います。しかし、確固たるルールはありません。

于 2011-06-22T01:25:04.453 に答える
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();
 }

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

于 2011-06-22T01:27:22.557 に答える
0

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

于 2011-06-22T01:38:11.957 に答える
0

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

最も簡単なのは宣言することthrows Exceptionですが、スローすることExceptionは非常に貧弱な設計上の選択です-それはあまりにも高レベルです。実際、悪役はHibernateです。そのメソッドは、よりも狭いものをスローするものとして宣言する必要がありますException

より良い方法は次のとおりです。

  1. 「ドメイン例外」を定義します。例:MyDatabaseException
  2. それを投げるためにあなたのメソッドを宣言する
  3. ドメイン例外にラップされた例外をキャッチしてから再スローします

このような:

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

この2番目のアプローチは、一般的に使用されるパターンです。

PSこれを@Sethのtry-catch-finallyの優れたアイデアと組み合わせると、さらに優れたアプローチが得られます。

于 2011-06-22T01:28:50.950 に答える