首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Seam管理的事务

Seam管理的事务
EN

Stack Overflow用户
提问于 2010-07-15 14:12:31
回答 1查看 2.1K关注 0票数 2

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

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

代码语言:javascript
复制
@Stateless
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class CrudServiceBean implements CrudService {

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

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

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-07-16 06:00:47

如前所述

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

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

第一个问题是,您有一个非EJB调用多个DAO的场景,每个DAO都是一个EJB。你可以想到

代码语言:javascript
复制
@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规范3.0声明

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

所以不能使用上面的场景。由于所有DAO都使用容器管理事务,所以Java规范不允许您同时使用容器管理事务和bean管理事务()。

所以解决办法是

将所有DAO封装在EJB无状态会话bean 中,其事务是容器管理的。它的行为将像委托组件一样。

代码语言:javascript
复制
@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组件中,使用

代码语言:javascript
复制
@Name("nonEjbComponent")
public class NonEjbComponent {

    private @In WrapperStateless wrapperStateless;

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

}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3256342

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档