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
- 他のどのカテゴリにも属さない一般的な例外。