JPA транзакция из сервлета - PullRequest
2 голосов
/ 08 марта 2012

У меня есть сервлет Java EE 6, который создает экземпляр FooBarModelImpl, и этот класс использует JPA для получения некоторых ресурсов.

public class FooBarModelImpl
{

    @Resource
    UserTransaction ut;

    @PersistenceContext(unitName="fooBarUnit")
    private EntityManager em;

    public void addPackage(UpgradePackageEntity p)
    {
        try{
            ut.begin();
            em.persist(p);
            ut.commit();
        } catch (..) {}
    }
}

Модуль сохранения настроен следующим образом:

<persistence-unit name="fooBarUnit" transaction-type="JTA">

Мой вопрос: как мне избавиться от ручного обращения с ut.begin() и ut.commit()? Я хотел бы использовать JPA, чтобы контейнер занимался управлением транзакциями.

1 Ответ

1 голос
/ 08 марта 2012

Вы должны убедиться, что ваш класс FooBarModelImpl управляется контейнером, чтобы безопасно внедрить PersistenceContext.См. Этот ответ относительно этой точки.

Как только это будет сделано, просто удалите вызовы методов begin() и commit(), потому что границы транзакций автоматически устанавливаются контейнером.

Вам больше не нужно будет хранить ссылку на объект UserTransaction.

...