Red Hat Training

A Red Hat training course is available for Red Hat JBoss Web Server

12.2.3. 例外ハンドリング

Session が例外 (SQLExceptionを含む) を投げた場合、直ちに、データベーストランザクションをロールバックし、 Session.close() を呼び、 Session インスタンスを破棄すべきです。Session のいくつかのメソッドは、セッションを一貫した状態には保ちません。Hibernate が投げた例外を、回復できるものとして扱うことはできません。 finally ブロックの中で close() を呼んで、 Session が確実に閉じられるようにしてください。
HibernateException は、Hibernate 永続化層の中で発生する多くのエラーをラップする、検査されない例外です。これは、Hibernate の古いバージョンにはありませんでした。私たちの意見は、アプリケーション開発者に回復不可能な例外を下層でキャッチすることを強要すべきではないということです。多くのシステムでは、検査されない例外と致命的な例外は、コールスタックの最初のフレームの1つ (例えば、上層で) で処理し、エラーメッセージをアプリケーションユーザーに表示するか、もしくは、他の適切な処理を実施します。Hibernate は、HibernateException 以外の検査されない例外も投げることに注意してください。これらもまた、回復不可能であり、適切な処理を実施すべきです。
Hibernate は、データベースとの対話中に投げられた SQLExceptionJDBCException でラップします。実際は、例外をより意味のある JDBCException のサブクラスに変換しようと試みます。元の SQLException は、 JDBCException.getCause() によりいつでも得られます。Hibernate は、 SessionFactory に追加されている SQLExceptionConverter を使い、SQLException を適当な JDBCException サブクラスに変換します。デフォルトでは、SQLExceptionConverter は設定されている SQL 方言により定義されます。一方で、独自の実装に差し替えることもできます。詳細は、 SQLExceptionConverterFactory クラスの Javadoc を参照してください。標準的な JDBCException のサブタイプを下記に示します。
  • JDBCConnectionException :基礎となる JDBC 通信のエラーを表します。
  • SQLGrammarException: 発行する SQL の文法もしくは構文の問題を表します。
  • ConstraintViolationException:何らかの形式の完全性制約違反を表します。
  • LockAcquisitionException:要求された操作を実施するのに必要なロックレベルを得る際のエラーを表します。
  • GenericJDBCException:他のカテゴリに入らなかった一般的な例外です。