【问题标题】:Java EE Transaction propagation with POJO calls in-between中间有 POJO 调用的 Java EE 事务传播
【发布时间】:2015-01-15 16:22:56
【问题描述】:

以下是 EJB 类 1 的源代码:

@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class EJB1 {

  public void method1(Callback callback) {
    callback.createObject();
    Entity1 entity = new Entity1();
    try {
      entityManager.persist(entity1);
      entityManager.flush()
    } catch(Exception e) {
      //do something
    }
  }
}

回调类是一个没有 TransactionalContext 的 POJO,它调用 EJB 2 的另一个方法(通过 JNDI 查找),再次具有 TransactionAttribute.REQUIRED:

public class Callback {

  public void createObject() {
    getEJB2().createObject();
  }

  public EJB2 getEJB() {
    //lookup EJB2 via JNDI
  }
}

EJB2源代码:

@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class EJB2 {

  public void createObject() {
     Entity2 entity = new Entity2();
     entityManager.persist(entity);
      entityManager.flush()
  }
}

如果在 EJB1 中持久化 entity1 失败(例如,由于数据库中的 UniqueConstraint),则 EJB1 的事务成功标记为回滚。例如,当尝试在 EJB1 的 try-catch 中删除创建的对象时不起作用(因为事务已标记为回滚)。

虽然在 EJB2 中创建和持久化的对象仍然存在并且没有回滚! 设置 - 用于实验性用途 - EJB2 事务上下文强制创建仍然可以正常工作(表明 EJB2 不会创建新事务,而是通过 REQUIRED 参与现有事务)。

但是为什么EJB2中新创建的对象没有回滚呢?

【问题讨论】:

    标签: rollback pojo transactional propagation


    【解决方案1】:

    与此同时,我们将 Java EE 应用服务器从 WebLogic 10.0 更改为 GlassFish 3,并将使用的持久性提供程序从 OpenJPA 1.0.0.1 更改为 EclipseLink 2.5.1,从而解决了这个问题。

    其中一项更改解决了问题,可能是切换到 EclipseLink。 现在事务被标记为回滚(这在之前不是问题,并且完全符合预期),此外,由于回滚,Entity2 的新持久实例被删除。

    抱歉,我之前没有提及此信息,因此可能无法找到原因。

    【讨论】:

      猜你喜欢
      • 2017-12-28
      • 1970-01-01
      • 2011-04-30
      • 1970-01-01
      • 2010-09-07
      • 2017-01-30
      • 1970-01-01
      • 2015-07-26
      • 1970-01-01
      相关资源
      最近更新 更多