交易所需的异常上执行更新JPQL更新查询(Transaction required exceptio

2019-08-18 19:40发布

当我尝试运行此代码,我得到这个错误。

错误:

javax.persistence.TransactionRequiredException:executeUpdate的不支持用于通过容器管理事务的EntityManager的非事务性访问获得的查询对象

代码:(_ut是UserTransaction对象)

公共无效setMainCategory(整数DEPTID,整型CATID){

        try {
            Query setmain = _entityManager.createNamedQuery("Category.setAsMain");
            Query removeMain = _entityManager.createNamedQuery("Category.removeMain");
            setmain.setParameter("categoryId", catId);
            Department d;
            d=_entityManager.find(Department.class, deptId);
            removeMain.setParameter("department", d);
            _ut.begin();
            removeMain.executeUpdate();
            _ut.commit();
            _ut.begin();
            setmain.executeUpdate();
            _ut.commit();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

我有一个在执行相同的其他功能,他们不抛出这个错误。

任何建议将不胜感激。

谢谢。

Answer 1:

您正在使用的EntityManager ,以获得命名查询,并使用(我认为是)注入UserTransaction

看到错误消息指出“......通过非事务性访问获得的查询对象......”。 这意味着你得到了通过非事务性访问“NamedQuery”,因为EntityManager是不是在相同的事务中_ut 。 所以,你首先加入EntityManagerUserTransaction然后你并执行查询。

最后你的块应该是这样的:

@PersistenceContext(unitName = "myPU")
EntityManager em;

@Inject
UserTransaction ut;

public void doSomeStuff()
{
    ut.begin();
    em.joinTransaction();

    em.createNamedQuery("query1").executeUpdate();

    ut.commit();
}


Answer 2:

这个问题并非来自你的方法实现,但是从你的执行上下文。
该更新数据库中的所有方法必须打开的事务中执行。 你保证的方式取决于您所管理的事务的方式。 如果交易被用户管理你必须明确地检索和加入现有的事务或打开一个新的。 如果是容器管理只需添加@transactional上你的方法的注释,或确保有一个在您调用层次的方法持注解。

这里,我们使用用户管理事务的容器管理事务上下文(看到你的错误消息“容器管理事务的EntityManager”)。 你不应该这么开始和提交/回滚自己的事务。 如果你想这样做,只是检索应用程序管理的EntityManager是可以正常访问到JTA事务。

比照 http://docs.oracle.com/cd/E19226-01/820-7627/bnbqy/index.html



Answer 3:

根据错误信息,我想原因是您的交易订单,你没有得到在交易部d,因此d的说法是分离,那么你要直接更新它,这将改变语句来管理中,JPA无法做到这一点。 只是移动在交易中发现的代码,我认为这将是确定。



文章来源: Transaction required exception on execute update for JPQL update query