EJB 3.1 Transaction,EntityManager

时间:2011-08-10 12:03:01

标签: ejb jpa-2.0

我有一个应用程序通过smack(基于事件的java库)处理IQ节。我们现在从vanilla Tomcat切换到glassfish 3.1,我想切换到ejb 3.1。

@Stateless
public class DispatchIQService {
    private static Logger log = Logger.getLogger(DispatchIQService.class);

    @PersistenceContext(unitName="hq")
    private EntityManager em;

    ....

    public void process(XMPPConnection connection, IQ rawRequest) {
    log.debug("Raw Provider IQ: " + rawRequest.toXML());

    RawResponse answer = null;

    try{
        StateWrapper state = new StateWrapper(em, connection, rawRequest);

        // parsing raw xml from request
        rawRequest.parse();
        // processing action
        answer = rawRequest.dispatchAction(state);

由于基于事件的库,我为每个请求获取了正确的对象。 StateWrapper是一个旧的构造,用于通过消息处理传递em,请求和连接。我想通过ejbs和依赖注入尽快删除它。

使用rawRequest.dispatchAction(state)我将控件传递给请求对象以查找Facade Service并从业务逻辑开始。

@Override
public RawResponse dispatchAction(StateWrapper state) {
    ModelFacade modelFacade = Core.lookup(ModelFacade.class);
    return modelFacade.listModels(state, childElement.getIds());
}

Core.lookup只是进行jndi查找以获取所需的Bean。在这个bean我可以注入em。

@Stateless
public class ModelFacade {

    @PersistenceContext(unitName="hq")
    private EntityManager em;

    ... 
public RsModelListIQ listModels(StateWrapper state, List<Long> list) { ...

我的问题是:这个em是否运行与DispatchIQService中的em相同的事务? 我怎么检查它? em的地址?

最好的问候 米

1 个答案:

答案 0 :(得分:1)

只要您处于同一事务中,则两个实例中注入的EntityManager将引用相同的“JPA事务上下文”。容器通常通过注入EntityManager代理来实现这一点,该代理通过查看事务线程上下文然后重新分派到每个事务的EntityManager来实现每个方法。您可以通过在DispatchIQService中更新实体然后在ModelFacade中重新查找实体以确保更新仍在那里来测试我的断言。