2

別の投稿 [1] によると、JNDI ルックアップを介してセッション EJB を呼び出すことと @EJB アノテーションを使用することに違いはありません。ただし、次のシナリオでは:

1.- セッション EJB1 を呼び出します (JDBC はここに挿入します) 2.- EJB1 から、セッション EJB2 を呼び出します (ここにさらに挿入します) 3.- トランザクションをロールバックします (EJB1 から)

@EJB アノテーションを使用すると問題なく動作しますが、JNDI ルックアップでは動作しません。2 番目の EJB のトランザクションは新しいトランザクションであり、ロールバックは発生しません。これはすべてCMTを使用しています。

これらすべてを Geronimo/ibmwasce-2.1.1.6 にデプロイしています。

¿ある EJB から別の EJB に明示的にトランザクションを渡す必要がありますか? コンティナーの仕事だと思っていました。手がかりは?

[1] @EJB アノテーション vs JNDI ルックアップ

アップデート:

注釈によるコード:

@EJB
private CodAppEjb codAppejbAnotacion; 

jndi 経由のコード:

CodAppEjb codAppejb;
InitialContext ctx;
Properties properties= new Properties();
properties.setProperty("java.naming.provider.url", "ejbd://127.0.0.1:4201");
properties.setProperty("java.naming.factory.initial", "org.apache.openejb.client.RemoteInitialContextFactory");
ctx = new InitialContext(properties);
codAppejb= (CodAppEjb) ctx.lookup("CodAppEjbBeanRemote");

トランザクションコードはまったく同じです。

4

1 に答える 1

3

トランザクションの伝播に問題があるようです。

問題は、ルックアップで、EJB1 と同じトランザクション コンテキストで実行されないリモート EJB (ローカルではない)JNDI検索することです。

@EJB上記のアノテーションを使用すると、同じトランザクション コンテキストでローカル実装が注入されます。

于 2013-09-09T07:55:16.927 に答える