Я пытаюсь выйти мой проект от 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()
работает. Зачем?
Должны ли они работать как всегда, так и при управлении приложениями и контейнере?
Используйте EJBs. Они обрабатывают транзакции декларативно. –
Спасибо JB Nizet, вы правы. Но я все еще ничего не понимаю. – robson
Хорошо, я обновил свой вопрос (и удаленный ответ - вы правы) – robson