JPA中的TransactionAttribute.REQUIRES_NEW

我测试了我的ejb jpa交易。 我使用Container管理的entityManager:

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

这样我有事务PersistanceContext范围和容器管理每个事务。 对于池化会话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与test1()中的相同?

我想你根本就没有调用商业方法。 你正在调用本地调用(隐式’this’) – 而不是EJB调用。

尝试使用业务接口进行此调用。

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

 test1(config); test2(config); 

 getBusinessObject(YourEJB.class).test1(config); getBusinessObject(YourEJB.class).test2(config); 

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