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