EJB3 元の JDBC エラーの取得
質問
デフォルトの TopLink 永続化マネージャーを使用して Glassfish で EJB3 を使用しています。セッション Bean 内で、永続性マネージャーが DB 例外をキャッチすると、ロールバックされるトランザクションにマークを付け、EJBException をスローし、次に RollbackException をラップします。ここで、これらの例外のいずれかの例外によって引き起こされる元の jdbc 例外を取得できると期待していましたが、そうではありません。
問題が何であるかをユーザーに報告する必要があるため、元の例外を取得することが重要です。そのためには SQL エラー コードを分析する必要があります。
Toplink からこの情報を入手できるかどうか知っている人はいますか?それとも Hibernate で可能になるのでしょうか?
ありがとう、
解決 3
私は私がやりたいことがわかってきた唯一の方法は、デシベル使用manager.flush()に書き込み、その後、それがスローというPersistenceExceptionをキャッチするために管理者を強制することです。私は、私が好きなデータベースエラーをログに記録し、ロールバックを強制的に持たないEJBExceptionをスローすることができます。フラッシュを行うには、コンテナのままにすると、回復不能のTopLinkとの任意の有用なメッセージを失うようです。
他のヒント
私は同じ問題がありました。私はにAroundInvokeインターセプタメソッドは、サーバー側で任意の例外をキャッチし、エキスあなたがしたいものは何でも情報や、独自の例外をスローし、トランザクションをロールバックするEJBContextのを設定し、それをラップすることができ、そのように使用して終了します。
あなたが右に来ていない場合は、私は例を提供することができます。
いい質問ですね、アントさん
データベース例外をスローしたいのはわかりますが、例外が発生すると、ほとんどの場合、アプリケーションは初期状態に復元できないか、そこから回復する方法がわかりません。だからそれは扱われるべきだ 実行時例外として. 。データベース例外におけるいくつかの問題には、次のようなものがあります。
- データベース接続の失敗
- クエリが間違っています
- テーブルまたは列が存在しません
上では、アプリケーションが初期状態を復元できないことがわかります。初期状態に戻せると思われる場合 したがって、アプリケーション例外を使用する必要があります. 。クライアントは、ビジネス メソッドによってスローされたのと同じアプリケーション例外を受け取ります。ビジネス メソッドによってスローされた例外を正確に取得できるようにしたい場合は、2 つの選択肢があります。
- ビジネス デリゲート パターンを使用して EJB にアクセスする
ご存知のとおり、ランタイム例外は EJBException によってラップされるため、次のようなものを使用する必要があります。
このステートレス セッション Bean があると仮定します。
@Stateless
public class BeanImpl implements Bean {
public void doSomething() {
try {
// some code
} catch(SomeException e) {
throw new EJBException(e);
}
}
}
したがって、ビジネス デリゲートを通じてセッション Bean をラップします。
public class BeamBusinessDelegate implements Bean {
// your stateless session bean goes here
private Bean bean;
public BeamImpl() {
InitialContext i = new InitialContext();
bean = (Bean) i.lookup(<GLOBAL_JNDI_ADDRESS_OR_RELATIVE_ENVIRONMENT_NAMING_CONTEXT_ADDRESS>);
}
public void doSomething() {
try {
bean.doSomething()
} catch(EJBException e) {
throw e.getCause();
}
}
}
または、ニーズに応じて EJBException を拡張することもできます
public class DatabaseException extends EJBException {
}
したがって、あなたのビジネスメソッドでは
@Stateless
public class BeanImpl implements Bean {
public void doSomething() {
try {
// some code
} catch(SomeException e) {
throw new DatabaseException();
}
}
}
よろしく、
私は同じ質問を持っている:?JPAから生成されたSQLエラー・メッセージを取得する方法
私は解決策のいずれかを発見していないが、私は私のpersistence.xmlでこの行を追加
<properties>
<property name="toplink.logging.level" value="FINE" />
</properties>
そして今、私が発行されたSQLコマンドを見ることができます。
リファレンス: のhttp:// WWW .jairrillo.com /ブログ/ 2008/9月4日/導入ツーJPA-パート-1--入門/ の