java - JPA 中的 TransactionAttribute.REQUIRES_NEW

标签 java jpa persistence

我测试了我的 ejb jpa 事务。我使用容器管理的entityManager:

@PersistenceContext(unitName = "ParticularUnit")
EntityManager em;

这样我就有了事务 PersistanceContext 范围,并且容器管理每个事务。 对于池化 session bean 的每个实例,创建entityManager 的实例。 当我用 @TransactionAttribute(TransactionAttributeType.REQUIRED) 标记 bean 方法时 调用其中的两个方法,我预计方法 test1 会有另一个 PersitenceContext,但我很惊讶,因为它是相同的。

@TransactionAttribute(TransactionAttributeType.REQUIRED)

public void test(Configuration config){
        if (!em.contains(config)) {
            config = em.find(Configuration.class, config.getId());
        }
        System.out.println("********************");
        System.out.println("actiovation, em= "+ em);
        System.out.println("actiovation, config= "+ config);
        System.out.println("*********************");

        test1(config);
        test2(config);
    }

    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    public void test1(Configuration config){
        config = em.find(Configuration.class, config.getId());
        System.out.println("////////");
        System.out.println("requires_new"+ config);
        System.out.println("requires_new, em= "+ em);
        System.out.println("----------------");
    }

    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void test2(Configuration config){
        config = em.find(Configuration.class, config.getId());
        System.out.println("////////");
        System.out.println("required"+ config);
        System.out.println("required, em= "+ em);
        System.out.println("----------------");
    }

我调用test并得到了这个跟踪。

********************
 actiovation, em= JPATxEntityManager@54515451
 actiovation, config= com.profix.sc.db.configuration.Configuration@7f287f28
 *********************
 ////////
 requires_newcom.profix.sc.db.configuration.Configuration@7f287f28
 requires_new, em= JPATxEntityManager@54515451[PuId=SCApplication#SCApplication-ejb.jar#SCApplication, SCApplication#SCApplication-ejb.jar#PaymentConfigBean#com.profix.sc.ejb.PaymentConfigBean/em]
----------------
  ////////
    requiredcom.profix.sc.db.configuration.Configuration@7f287f28
  required, em= JPATxEntityManager@54515451[PuId=SCApplication#SCApplication-ejb.jar#SCApplication, SCApplication#SCApplication-ejb.jar#PaymentConfigBean#com.profix.sc.ejb.PaymentConfigBean/em]

为什么 test1() persistenceContext 与 test() 中的相同?

最佳答案

我猜您根本没有调用业务方法。您正在调用本地调用(隐式“this”)——而不是 EJB 调用。

尝试使用 business interface 进行此调用.

尝试在 test() 类中更改对 test1() 和 test2() 的调用:

test1(config);
test2(config);

getBusinessObject(YourEJB.class).test1(config);
getBusinessObject(YourEJB.class).test2(config);
PS。我对此不确定,但容器可以使用 EntityManager 的代理对象,因此请尝试测试您是否确实位于同一个 PersistenceContext 中(通过执行一些操作而不是仅调用它的引用)

关于java - JPA 中的 TransactionAttribute.REQUIRES_NEW,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8079142/

相关文章:

java - 不知道如何转换为字符串并打印 ResultSet、SELECT 语句

java - 注册问题

java - 如何使用 Java 准确地重新填充动态表单

java - 尝试级联持久子实体时出现 PersistenceException

java - 如何动态更改 sql 'like' 运算符?

java - 调用getNextException查看原因: How to make Hibernate/JPA show the DB server message for an exception

design-patterns - JPA 查找表设计

java - Hibernate JPA 加载实体中选定的列

java - 是否有非商业 Hibernate 查询检查器?

java - JPA持久化单元写入文件?