Seam管理的事务操作方法

时间:2010-07-15 14:12:32

标签: java transactions weblogic seam bean-managed-transactions

Seam建议在有状态会话Bean中使用扩展持久性上下文,以便拥有Seam管理的持久性。

我不清楚上述建议是否对我们希望拥有Seam管理的交易的方式产生任何影响。这是因为我们的架构不同。我们在无状态 EJB中具有以下持久性上下文:

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

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

我们的DAO使用@TransactionAttribute(TransactionAttributeType.REQUIRED)调用上面的CrudServiceBean是无状态EJB(其中一些也是Seam组件)。因此,我们的交易由容器(WebLogic)处理,而不是Seam。

但是,我们现在需要满足以下场景:我们需要有一个前端Seam组件(非EJB )调用多个DAO(EJB)方法并将所有这些方法包装在一个单笔交易。如果我理解正确,我们需要有Seam管理的交易。

我们是否可以像我描述的场景一样拥有Seam管理的事务,而没有Seam管理的持久化上下文?或两者无关?

1 个答案:

答案 0 :(得分:2)

如上所述

  

我们需要有一个前端Seam组件(非EJB )调用多个DAO(EJB)方法,将所有这些组件包装在一个事务中

但是

  

我们的交易由容器处理 - 也称为容器管理事务(容器负责调用每个底层资源管理器事务使用的begin和commit 方法)

第一个问题是,您有一个非EJB调用多个DAO的场景,每个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();

    }

}

但Java EE规范3.0声明

  

具有bean管理或容器管理的事务划分的企业bean必须是会话bean或消息驱动的bean

所以你不能使用上面的场景。并且因为所有DAO都使用容器管理的事务,所以Java EE规范不允许您同时使用容器管理和bean管理的事务 < / p>

所以解决方案是

将所有DAO包装在EJB Stateless会话bean 中,其事务是容器管理的。它的行为类似于委托组件

@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();
    }

}