我有一个创建FooBarModelImpl实例的Java EE 6 servlet,该类使用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,以便容器处理事务管理。

最佳答案

您必须确保您的类FooBarModelImpl由容器管理,以便安全地注入PersistenceContext。关于这一点,请参见此answer

完成此操作后,只需删除begin()commit()方法调用,因为事务边界是由容器自动设置的。

您也无需保留对UserTransaction对象的引用。

关于java - 来自servlet的JPA事务,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9615400/

10-10 00:54