EclipseLinkを使用してBean管理トランザクションでトランザクションのタイプ(JTAまたはリソース・ローカル)を検出することは可能ですか? はいの場合、どうすればこれを行うことができますか?
実際には、Javaクラスで可能であれば、トランザクションタイプとJNDI名も検出する必要があります。
EclipseLinkを使用してBean管理トランザクションでトランザクションのタイプ(JTAまたはリソース・ローカル)を検出することは可能ですか? はいの場合、どうすればこれを行うことができますか?
実際には、Javaクラスで可能であれば、トランザクションタイプとJNDI名も検出する必要があります。
トランザクションのタイプは次のように検出できます。
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 カタログをスキャンして正しいものを選択できる場合があります。たとえば、こちらのコードを参照してください。