2013-04-20 3 views
0

Я пытаюсь выйти мой проект от Seam 3.JTA EntityManager без руководства совершает

Теперь я застрял на JTA транзакций после выключения Шов Faces модуля. Было интегрированное управление транзакциями. Транзакции были начаты и совершены автоматически - без ручной фиксации.

Теперь, когда я пытаюсь выполнить EntityManager.persist() или EntityManager.merge(Object entity), я получил сообщение об ошибке:

JBAS011469: Transaction is required to perform this operation (either use a transaction or extended persistence context) 

Есть ли способ заставить JTA начать транзакцию и совершить это прозрачно?

Ps. Смешная вещь - некоторое время назад я искал решение, как заставить ручной фиксации/откат в Seam3.

ОК, если я поставлю bean-компонент в состояние @Stateless - тогда он ведет себя так, как я ожидал.

Но ...

Не правда ли - что если я ставлю приложение управляемого EntityManager - то я должен управлять сделкой по моему собственному (методу testApplicationJTA() в примере ниже), но если я использую контейнер удался EntityManager - то он должен работать без управления транзакциями (метод testContainterJTA())?

Мой пример:

@Named 
@SessionScoped 
public class Test implements Serializable { 

    private static final long serialVersionUID = 1L; 

    @PersistenceContext 
    private EntityManager   em; 

    @PersistenceUnit 
    private EntityManagerFactory emf; 

    @Resource 
    private UserTransaction   utx; 

    public void testContainerJTA() { 
     TestEntity entity = em.find(TestEntity.class, 1L); 
     entity.setName("dddddd"); 
     em.merge(entity); 

    } 

    public void testApplicationJTA() { 
     EntityManager mgr = emf.createEntityManager(); 
     TestEntity entity = em.find(TestEntity.class, 1L); 
     entity.setName("fffff"); 
     try { 
      utx.begin(); 
      mgr.joinTransaction(); 
      mgr.merge(dict); 
      utx.commit(); 
     } catch (Exception e) { 
      utx.rollback(); 
     } 

     mgr.close(); 

    } 
} 

В моем примере выше метод testContainerJTA() не работает. Зачем?

Если я удалю @SessionScoped и поставлю @Stateless, тогда метод testApplicationJTA() не работает, но testContainerJTA() работает. Зачем?

Должны ли они работать как всегда, так и при управлении приложениями и контейнере?

+1

Используйте EJBs. Они обрабатывают транзакции декларативно. –

+0

Спасибо JB Nizet, вы правы. Но я все еще ничего не понимаю. – robson

+0

Хорошо, я обновил свой вопрос (и удаленный ответ - вы правы) – robson

ответ

1

ОК, так что это можно сделать CDI боб tansactional - с перехватчиками :-)

Наконец мне удалось решить мою проблему читать эту статью:

http://smokeandice.blogspot.com/2009/12/cdi-and-declarative-transactions.html

Edit:

Из JEE7 есть новая аннотация @Transactional, в которой все транзакции JPA в компоненте CDI или методе транзакции.

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