代码之家  ›  专栏  ›  技术社区  ›  Markos Fragkakis

Seam管理的事务处理方法

  •  2
  • Markos Fragkakis  · 技术社区  · 15 年前

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

    我不清楚上面的建议是否会对我们希望Seam管理的事务的方式产生任何影响。这是因为我们的架构不同。我们在 无国籍的 EJB:

    @Stateless
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public class CrudServiceBean implements CrudService {
    
        @PersistenceContext(type = PersistenceContextType.TRANSACTION)
        private EntityManager em;
    ...
    }
    

    我们的DAO调用上述CrudServiceBean是无状态EJB(其中一些也是Seam组件),带有@TransactionAttribute(TransactionAttributeType.Required)。所以,我们的交易是处理的 通过容器 (WebLogic)而不是Seam。

    但是,我们现在需要满足以下场景:我们需要一个前端Seam组件( 非EJB )调用多个DAO(EJB)方法,并将它们全部包装在一个事务中。如果我理解正确,我们需要有Seam管理的事务。

    我们是否可以像我描述的场景那样拥有Seam管理的事务,而不需要Seam管理的持久性上下文?或者这两者是无关的?

    1 回复  |  直到 11 年前
        1
  •  2
  •   Arjan Tijms Mike Van    11 年前

    正如所说的

    我们需要一个前端接缝组件( 非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();
    
        }
    
    }
    

    但是JavaEE规范3状态

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

    所以你 不能 使用上面的场景。因为所有的DAO都使用容器管理事务,JavaEE规范 不允许使用 容器管理和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();
        }
    
    }