С источником данных JTA работа над его соединениями является частью транзакции JTA.Это означает, что вам нужно запустить и зафиксировать или откатить транзакцию JTA.
Самый простой способ сделать это - выполнить JPA-работу внутри сессионного компонента:
@Stateless
public class SomeBean {
@PersistenceContext
private EntityManager entityManager;
public void doStuff() {
// … do some stuff
entityManager.persist(someObj);
}
}
В этом случаетранзакция начинается при входе в метод doStuff()
и заканчивается при выходе из него.
Но если по какой-то причине вы хотите запустить транзакцию вручную в каком-либо другом типе компонента (например, управляемый компонент JSF,Servlet, Servlet filter и т. Д.), Вы можете напрямую использовать API:
public class SomeBean {
@Resource
private UserTransaction tx;
public void doStuff() {
try {
tx.begin();
// … do some stuff
entityManager.persist(someObj);
tx.commit();
}
catch (Throwable t) {
tx.rollback();
throw t;
}
}
}
Использование сессионного компонента и его так называемых декларативных транзакций - почти всегда рекомендуемый подход.