1

EJB 3.0 で 1 つのステートレス セッション Bean から 2 つのデータベースにアクセスしたいと考えています。2 つのデータベースと通信するために、2 つのエンティティ マネージャーを宣言したセッション Bean を作成しました。エンティティ マネージャーは、ステートレス セッション Bean で次のように定義されます。

@PersistenceContext (unitName="abc") private EntityManager manager;
@PersistenceContext (unitName="xyz") private EntityManager manager1;

最初のエンティティ マネージャーを使用して 1 つのデータベースからデータを取得し、それを 2 番目のエンティティ マネージャーを使用して 2 番目のデータベースに挿入します。私の問題は、両方のエンティティマネージャーを宣言できるが、両方を同時に使用できないことです。それらのいずれかを使用してコメントアウトする必要があります。そうしないと、次の例外が発生します。

Caused by: org.hibernate.exception.GenericJDBCException: Cannot open connection
Caused by: org.jboss.util.NestedSQLException: Could not enlist in transaction on
entering meta-aware object!;
  - nested throwable:" "Caused by:  
    org.jboss.resource.JBossResourceException: Could not enlist in transaction on entering meta-aware object"
    "Caused by: javax.transaction.SystemException: java.lang.Throwable:"
4

1 に答える 1

0

ステートレス セッション Bean の各メソッドはトランザクションを取得します。メソッド内で複数のデータベースにアクセスしている場合は、tx ではなく xa データソースが必要です。

以前にこれに遭遇しましたが、回避策があります。データベースごとに個別のステートレス セッション Bean を作成し、元のステートレス セッション Bean で元のメソッドのトランザクションをオフにします。

@EJB(mappedName="com.abc.AbcManager")
private AbcManager abcManager;

@EJB(mappedName="com.xyz.XyzManager")
private XyzManager xyzManager;

@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)
public MyResponse getMyData(MyRequest request) throws MyException {
    Collection<Data> data = abcManager.getData();

    xyzManager.storeData(data);

    return null;
}

新しいセッション Bean のメソッドは独自のトランザクションを作成しますが、他の 2 つを調整する 1 つのステートレス セッション Bean を持つことができます。

于 2013-04-16T14:23:27.827 に答える