【问题标题】:EJB 3.1 Transaction, EntityManagerEJB 3.1 事务,EntityManager
【发布时间】:2011-08-10 12:03:00
【问题描述】:

我有一个通过 smack(基于事件的 java 库)处理 IQ 节的应用程序。我们现在从原版 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) 我将控制权传递给请求对象以查找外观服务并从业务逻辑开始。

@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 相同的事务下运行? 我怎样才能检查它?他们的地址?

最好的问候 米

【问题讨论】:

    标签: ejb jpa-2.0


    【解决方案1】:

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

    【讨论】:

    • 这是个好主意!我很确定我在同一笔交易中,但我想知道我是否正确。
    • 如果我没记错的话,EntityManager 代理会查看其持久性上下文而不是“事务线程上下文”。当 EntityManager 加入事务时,持久性上下文会刷新(同步)到数据库。
    • @MikeArgyriou 查看“持久性上下文”是什么意思?以我的经验,这意味着使用 TransactionSynchronizationRegistry(即事务线程上下文)。另外,我认为实体管理器在事务提交的 beforeCompletion 步骤之前不会被刷新(除非明确完成)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 2015-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多