5.2.3. 例外処理
EntityManager が例外 (SQLException を含む) をスローした場合は、データベーストランザクションをすぐにロールバックし、EntityManager.close() を呼び出し (createEntityManager() が呼び出された場合)、EntityManager インスタンスを破棄する必要があります。EntityManager の一部のメソッドでは、永続コンテキストが整合性がある状態に保たれません。エンティティマネージャによりスローされた例外は復元可能として処理できません。finally ブロックで close() を呼び出し、EntityManager が終了するようにしてください。コンテナが管理するエンティティマネージャはユーザーのためにこれを行います。RuntimeException がコンテナに伝播するようにします。
Hibernate エンティティマネージャは、通常 Hibernate コア例外をカプセル化する例外を発生させます。
EntityManager API により発生する一般的な例外は以下のとおりです。
- IllegalArgumentException: 引数は許可されないか、認識されないか、または不正な形式 (または類似のこと) になります。
- EntityNotFoundException: エンティティが期待されていましたが、要件に一致するものがありません。
- TransactionRequiredException: この操作はトランザクションに含まれる必要があります。
- IllegalStateException: エンティティマネージャが間違った方法で使用されています。
Hibernate 永続レイヤで発生することがあるほとんどのエラーをラップする
HibernateException は未チェックの例外です。また、Hibernate は HibernateException でない他の未チェックの例外をスローすることもできます。これらは復元不可であり、適切なアクションをとる必要があります。
Hibernate は
JDBCException のデータベースとの対話中にスローされた SQLException をラップします。実際には、Hibernate は例外を JDBCException の意味のあるサブクラスに変換しようとします。基礎となる SQLException は常に JDBCException.getCause() から利用できます。Hibernate は SessionFactory に接続された SQLExceptionConverter を使用して SQLException を適切な JDBCException サブクラスに変換します。デフォルトでは、SQLExceptionConverter は設定されたダイアログにより定義されます。ただし、カスタムの実装を接続することもできます (詳細については、SQLExceptionConverterFactory クラスの javadoc を参照)。標準的な JDBCException サブタイプは以下のとおりです。
JDBCConnectionException- 基礎となる JDBC 通信でのエラーを示します。SQLGrammarException- 発行された SQL の文法または構文エラーを示します。ConstraintViolationException- 何らかの整合性制約違反を示します。LockAcquisitionException- 要求された操作を実行するのに必要なロックレベルを示します。GenericJDBCException- 他のどのカテゴリにも属さない一般的な例外。