TransactionAttribute.REQUIRES_NEW в JPA - PullRequest
       1

TransactionAttribute.REQUIRES_NEW в JPA

2 голосов
/ 10 ноября 2011

Я проверил мои транзакции ejb jpa. Я использую управляемый контейнером entityManager:

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

У меня есть область действия PersistanceContext и контейнер управляет каждой транзакцией. Для каждого экземпляра объединенных сессионных компонентов создается экземпляр 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()?

1 Ответ

4 голосов
/ 10 ноября 2011

Полагаю, вы вообще не используете бизнес-метод.Вы вызываете локальный вызов (неявный 'this'), а не EJB.

Попробуйте выполнить этот вызов с помощью бизнес-интерфейса .

Попробуйте изменить вызовыto test1 () и test2 () в классе test () от:

test1(config);
test2(config);

до

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

PS.Я не уверен в этом, но контейнер может использовать прокси-объект для EntityManager, поэтому попробуйте проверить, действительно ли вы находитесь в том же PersistenceContext (выполняя некоторые операции, а не просто вызывая его ссылку)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...