我测试了我的 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/