gpt4 book ai didi

java - JPA 中的 TransactionAttribute.REQUIRES_NEW

转载 作者:行者123 更新时间:2023-11-30 07:30:04 28 4
gpt4 key购买 nike

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

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

这样我就有了事务 PersistanceContext 范围和容器管理每个事务。为池 session bean 的每个实例创建 entityManager 的实例。当我用 @TransactionAttribute(TransactionAttributeType.REQUIRED) 和在其中调用两个方法,我预计方法 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);

附言。我不确定,但是容器可以使用 EntityManager 的代理对象,所以尝试测试你是否真的在同一个 PersistenceContext 中(通过做一些操作而不是仅仅调用它的引用)

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

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com