1

アプリケーションで Spring Hibernate 統合を使用しており、DAO クラスが拡張されていますHibernateDaoSupport
コードを使用してオブジェクトを保存すると getHibernateTemplate().save(object); します。Spring Hibernate 統合では、try-catch ブロックの書き込みが義務付けられていませんが、そのオブジェクトの保存中に例外がスローされたとします。では、どのように処理するのが最善でしょうか。つまり、サービス層でキャッチし、ユーザー定義の例外でラップする必要があります。DAO のどのメソッドが例外をスローしたかをログに記録したい場合、DAO レイヤー メソッド自体に try-catch を記述する必要がありますか?

私は HibernateDaoSupport または Hibernate Template を使用したことがないので、例外処理について無知です。貴重な情報を提供してください

4

2 に答える 2

2

Spring の使用の背後にある考え方RuntimeExceptionは、通常、さまざまな種類の例外があるということです。

  • 回復したい例外 (挿入しようとしているレコードが既に存在する場合のDuplicateKeyExceptionや、ユーザー入力の結果として違反した DB 制約があった場合のより一般的なDataIntegrityViolationExceptionなど)
  • 回復できない例外 (データベースがダウンしている)

最初のケースでは、例外を適切に処理できます (カスタム ビジネス例外を使用して、ビュー レイヤーが入力ページにリダイレクトし、意味のあるメッセージを提供できるようにします)。

2 番目のケースでは、例外をバブルアップさせて、一般的な例外ハンドラーで処理し、一般的なエラー ページをユーザーに表示する方が簡単です。このシナリオでは、回復できないため、カスタム例外で例外をラップしても意味がありません。爆破された DB は致命的になりがちです。

だから私は何をしますか:

try {
   getHibernateTemplate().save(object);
} catch (DataIntegrityViolationException dive) {
   throw new BusinessValidationException(dive, "You've got the data wrong");
}
于 2012-08-24T10:36:14.827 に答える
0

Spring 例外階層は十分に文書化されています。

通常、データ アクセスの例外が発生した場合、多くのことを行うことはできません。これは、稼働中のシステムでは、DB サーバーのディスク領域の不足やネットワーク接続の問題などが原因である可能性があるためです。このような例外は、通常、ログに記録して調査する必要があります。できるだけ早く。

いくつかの回復可能なエラーがあり、それらは春の例外階層で処理できますが、開発段階ではそれらのほとんどを回避する必要があるため、Web サーバーはデータベースに行く前にできるだけ多くのことを検証する必要があります。

例外ログを設定する場合は、同様の質問を参照してください。

于 2012-08-24T10:45:37.310 に答える