質問

デフォルトの 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--入門/

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top