2013-08-16 4 views
1

Я имею в Containter управляемой transaction- боба что-то вроде этого:javax.persistence.TransactionRequiredException после setRollbackOnly

@PersistenceContext 
    private EntityManager em; 

    @Resource 
    private EJBContext ejbContext; 


    public void testTransaction() { 
    Model model1 = new Model(); 
    em.persist(model1); 

    ejbContext.setRollbackOnly(); 

    Model model2 = new Model(); 
    em.persist(model2);//the line the problem 
    } 

В последней строке (с проблемой) а TransactionRequiredException брошено:

javax.ejb.EJBException: javax.persistence.TransactionRequiredException: JBAS011469: Transaction is required to perform this operation (either use a transaction or extended persistence context) 

, но в книге Mastering EJB 4th edition (поиск «Doomed Transactions» или перейдите на страницу 299) объясняется так, что не будет выбрано никаких таких исключений, и вместо этого вы должны проверить ejbContext.getRollbackOnly() только до ресурсоемких операций.

Конечно, я мог бы в этом простом примере избежать проблемы, выбросив Exception, аннотированный @ApplicationException(rollback=true), но мне просто интересно, чего я пропустил.

ответ

0

Вызывая ejbContext.setRollbackOnly(), вы отменили текущую транзакцию, запущенную контейнером. После этого нет транзакции, которая может быть связана с em.persist (model2) ;. Таким образом, вы получаете исключение. Чтобы проверить, активна ли транзакция, используйте метод getRollbackOnly() в ejbcontext, который вернет false.

+1

Ну, это единственное объяснение для моего случая, но в документации на setRollBackOnly() ничего не написано о смене текущей транзакции (и ни в EJB 3.1 Specs) http: // docs .oracle.com/javaee/6/api/javax/ejb/EJBContext.html # setRollbackOnly% 28% 29 Поэтому я мог бы предположить, что это ошибка. Я попробовал это в Jboss 7.1.1. С каким AS вы это попробовали? –

Смежные вопросы