2

Seamは、Seamで管理された永続性を実現するために、ステートフルセッションBeanで拡張永続コンテキストを使用することをお勧めします。

上記のアドバイスが、Seamで管理されるトランザクションの方法に影響を与えるかどうかはわかりません。これは、アーキテクチャが異なるためです。ステートレスEJBには次の永続コンテキストがあります。

@Stateless
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class CrudServiceBean implements CrudService {

    @PersistenceContext(type = PersistenceContextType.TRANSACTION)
    private EntityManager em;
...
}

上記のCrudServiceBeanを呼び出すDAOは、@ TransactionAttribute(TransactionAttributeType.REQUIRED)を使用するステートレスEJB(一部はSeamコンポーネントでもあります)です。したがって、トランザクションはSeamではなくコンテナ(WebLogic)によって処理されます。

ただし、次のシナリオを満たす必要があります。フロントエンドのSeamコンポーネント(非EJB)で複数のDAO(EJB)メソッドを呼び出し、それらすべてを1つのトランザクションでラップする必要があります。私が正しく理解していれば、Seamで管理されたトランザクションが必要です。

Seam管理の永続コンテキストがなくても、説明したシナリオのようにSeam管理のトランザクションを実行できますか?それとも、2つは無関係ですか?

4

1 に答える 1

2

言われるように

フロントエンドのSeamコンポーネント(非EJB)で複数のDAO(EJB)メソッドを呼び出し、それらすべてを1つのトランザクションでラップする必要があります。

だが

私たちのトランザクションはコンテナによって処理されます-コンテナ管理トランザクションとも呼ばれます(コンテナは、基になる各リソースマネージャトランザクションによって使用されるbeginメソッドとcommitメソッドの呼び出しを処理します)

最初の問題は、非EJBが複数のDAOを呼び出し、それぞれがEJBであるというシナリオがあることです。あなたは考えることができます

@Name("nonEjbComponent")
public class NonEjbComponent {

    private @In DaoEjbComponent daoEjbComponent;
    private @In OtherDaoEjbComponent otherDaoEjbComponent;
    private @In AnotherDaoEjbComponent anotherDaoEjbComponent;

    private @In UserTransaction userTransation;

    public void wrapperAllOfThem() {

         userTransation.begin();

             daoEjbComponent.save(someEntity);
             otherDaoEjbComponent.update(otherEntity);
             anotherDaoEjbComponent.delete(anotherEntity);

         userTransation.commit();

    }

}

しかし、JavaEE仕様3.0には次のように記載されています。

Bean管理またはコンテナ管理のトランザクション境界を持つエンタープライズBeanは、セッションBeanまたはメッセージ駆動型Beanである必要があります

したがって、上記のシナリオを使用することはできません。また、すべてのDAOがコンテナー管理トランザクションを使用しているため、Java EE仕様では、コンテナー管理トランザクションとBean管理トランザクションを同時に使用することはできません。

したがって、解決策は

トランザクションがコンテナ管理されているEJBステートレスセッションBeanですべてのDAOをラップします。デリゲートコンポーネントのように動作します

@Stateless
@TransactionAttribute(TransactionAttributeType.REQUIRED)
@Name("wrapperStateless")
public class WrapperStatelessImpl implements WrapperStateless {

    private @In DaoEjbComponent daoEjbComponent;
    private @In OtherDaoEjbComponent otherDaoEjbComponent;
    private @In AnotherDaoEjbComponent anotherDaoEjbComponent;

    public void wrapperAllOfThem() {

        daoEjbComponent.save(someEntity);
        otherDaoEjbComponent.update(otherEntity);
        anotherDaoEjbComponent.delete(anotherEntity);

    }

}

また、EJB以外のコンポーネント内では、

@Name("nonEjbComponent")
public class NonEjbComponent {

    private @In WrapperStateless wrapperStateless;

    public void wrapperAllOfThem() {
        wrapperStateless.wrapperAllOfThem();
    }

}
于 2010-07-16T06:00:47.833 に答える