2012-05-08 5 views
0

私は、Try/Catchブロック内にHibernate DB保存操作を呼び出して行を挿入するメソッドを持っています。HibernateがDB例外をキャッチするほど高速でフラッシュしない

DBの問題がある場合でもメソッドは正常に完了します(NULL以外の列にNULLを挿入する場合など)。その後、ある時点で、Hibernateはトランザクションを "フラッシュ"または完了しようとします。そのときにエラーがスローされます。

これは、私のメソッドが他のことを成功させることに成功しているため、コードの流れが乱れてしまいます。電子メールを送信します。私のメソッドを呼び出した後、私はエラーが起こっていないという仮定に基づいて電子メールを送信します(そうでなければ、私のコードフローからキャッチブロックに投げ込まれてしまいましたが、ではなくが起こっています)。

このような状況に対処する方法はありますか?

+0

どのようなトランザクション管理/戦略を使用していますか? DBにコミットされることが予想される場合は、明示的なトランザクションを使用する必要があります。暗黙的なトランザクションに頼るのは決して良い考えではありません... http://hibernateprofiler.com/learn/alerts/DoNotUseImplicitTransactions –

+0

私は確信していませんが、Hibernateレイヤーですぐに自動フラッシュする方法はありますか? (私はDBレイヤーについて話しているわけではありません、それはまだトランザクションです。) –

+0

なぜあなたは例外を取得していませんか? HibernateやJDBCの例外と同様? –

答えて

3

簡潔な答えはSession.flush()を呼び出すだけです。保留中のSQLが実行され、その時点で発生する可能性があるSQL例外が発生します。

より広い範囲では、SQL例外を使用してエラーを検出するのではなく、アプリケーションレベルでデータを検証するオプションを調べることができます。どちらの方法にも上下の違いがあります。

+0

うん、それはうまくいった。ありがとう。 –

+1

私はSession.flush()を明示的に呼び出すことをお勧めしません。これを行う必要性は、ほとんどの場合、Hibernateフレームワークを間違って使用していることを示しています。私は、アプリケーションがあなたのために妥当性を確認することについてあなたのポイントに同意します。これはhbm.xmlマッピングファイルを展開して、DBに追加した制約を含めることで実行できます。これはhbm2ddlツールのボーナス(良い)副作用を持っていて、もしあなたがそれを使うならば、現実に近いスキーマを作成します。 –

+0

これで、Hibernateがフラッシュするとき、どうやって正確に知ることができますか? flush()を使用しないと、エラーをチェックするタイミングをどのように知ることができますか? –

関連する問題