JPA例外をアプリケーション例外に変換する簡単な方法はありますか?
Java EE コンテナー (JBoss) 内のリモート セッション Bean は、RMI を介してクライアントによって呼び出されます。Session Bean は JPA Entity Manager を注入し、データベースに何かを書き込んでいます。トランザクションはコンテナー (JTA) によって処理されます。データベースへの書き込み時に例外が発生すると、この例外がクライアントにスローされます。私は Hibernate を使用しているので、クライアントに Hibernate Exceptions があります。クライアントは Hibernate ライブラリを認識していないため、クライアントで ClassNotFoundExceptions が発生しています。ここで、コンテナー内の例外を変換し、クライアントが処理できる例外をスローしたいと考えています。私は次のアイデアを持っていましたが、それらにはすべて欠点があると思います:
- データベースに書き込む前に制約をチェックするなどして、JPA 例外を回避します。これは、ビジネス ロジックで DB 制約を複製することを意味します。
- ビジネス メソッド内で Entity Manager をフラッシュし、メソッド内でフラッシュ中に発生する可能性のあるエラーをキャッチして変換します。Persistence Provider がデータベースとの対話を可能な限り延期するという考え方が気に入っています。
- Container Managed Transactions を無効にして、自分の Interceptor でトランザクション管理を行っています。このようにして、コミット前またはコミット中に発生するすべての例外をキャッチし、それらをアプリケーション例外にラップできます。
- Spring JPA および Springs Exception Translation 機能を使用します。私はすでに Java EE コンテナにいますが、Java EE で例外変換を行う方法があるのでしょうか?