2

EclipseLinkを使用してBean管理トランザクションでトランザクションのタイプ(JTAまたはリソース・ローカル)を検出することは可能ですか? はいの場合、どうすればこれを行うことができますか?

実際には、Javaクラスで可能であれば、トランザクションタイプとJNDI名も検出する必要があります。

4

1 に答える 1

3

トランザクションのタイプは次のように検出できます。

EntityManager em = emf.createEntityManager();

boolean isJta = false;
try {
    EntityTransaction et = em.getTransaction();
} catch (IllegalStateException ise) {
    if (ise.getMessage().startsWith("A JTA EntityManager cannot use getTransaction")) {
        isJta = true;
    }
}

エラー メッセージを微調整する必要がある場合があります。これは Hibernate (4.x) がスローするものと一致しますが、EclipseLink はおそらくわずかに異なるメッセージをスローします (ただし、例外クラス インスタンスはおそらく同じです)。

データ ソースまたは永続化ユニットの JNDI 名に関しては、そのタイプの情報、AFAIK は JPA クラスによって公開されません。EclipseLink (または他の ORM フレームワークの場合は ORM フレームワーク固有) のメソッドを使用して抽出できる場合があります。つまり、EntityManagerFactoryインスタンスはもちろん、そのインタフェースを実装する EclipseLink クラスのインスタンスです。EMF のインスタンスがあるテストをデバッグし、そのフィールドとプロパティを調べます。

それ以外の場合は、JNDI カタログをスキャンして正しいものを選択できる場合があります。たとえば、こちらのコードを参照してください。

于 2013-08-30T13:12:52.667 に答える