EntityManager的抛出对JBoss的JSF豆合并()TransactionRequired

2019-09-17 16:07发布

我已经成立了JBoss上5.0.1GA JSF应用程序通过一个按钮呈现在表格的用户列表,并允许个人用户删除旁边的每个用户。

当deleteUser叫,呼叫被传递到UserDAOBean后者从JBoss的注入一个EntityManager。

我正在使用的代码

public void delete(E entity)
{
    em.remove(em.merge(entity));
}

删除用户(码是C&P从JPA教程)。 只需调用em.remove(实体)没有任何作用,还是引起了同样的异常。

当到达这条线,我得到一个TransactionRequiredException:

(跳过显然不相关的堆栈跟踪,东西)

...

20:38:06406 ERROR [[面临的Servlet]为servlet的Servlet.service()面对的Servlet抛出异常javax.persistence.TransactionRequiredException:EntityManager的必须org.jboss.jpa.deployment.ManagedEntityManagerFactory.verifyInTx在事务内访问(ManagedEntityManagerFactory的.java:155)在org.jboss.jpa.tx.TransactionScopedEntityManager.merge(TransactionScopedEntityManager.java:192)在at.fhj.itm.utils.DAOImplTemplate.delete(DAOImplTemplate.java:54)在at.fhj.itm。 UserBean.delete(UserBean.java:53)在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)

...

我已经尝试过换手动管理的事务(em.getTransaction()。开始()+ .commit())左右,但是,这个失败,因为它不是JBoss容器内进行。 我曾与UserTransaction的没有成功要么。 在网络这个问题上搜索也止跌回升没有类似的案例和解决方案。

有没有人经历过类似的事情之前,并找到了解决这个?

Answer 1:

找到了缺失的一环。

这确实是一个缺少的交易,但解决办法是不使用EntityManager来处理,但增加了注入的UserTransaction。

@Resource
UserTransaction ut;
...
public void delete(E entity)
{
        ut.begin();
        em.remove(em.merge(entity));
        ut.commit();
}

由于这在某种程度上超过100个弯道导致这种解决方案的所有建议。



Answer 2:

知道这是一个老问题,但以防万一有人在此跌倒喜欢我。

尝试

em.joinTransaction();
em.remove(bean);
em.flush();

这就是我们在我们所有的@Stateful bean使用。

如果您在使用Seam,你也可以使用@Transactional(TransactionPropagationType.REQUIRED)注释。



Answer 3:

你确定你注释你的bean与@Stateless或XML注册呢?

尝试交易的注释添加到您的代码,这可以帮助你:

@TransactionAttribute(REQUIRED)
public void delete(E entity)
{
        em.remove(em.merge(entity));
}

但它似乎很奇怪,因为这是,如果你不设置明确的默认值。



Answer 4:

只是记:我们今天遇到了同样的问题,竟然有人标志着EJB作为TransactionAttributeType.NOT_SUPPORTED和方法TransactionAttributeType.REQUIRED,导致em.merge失败缺乏交易。



文章来源: EntityManager throws TransactionRequiredException on merge() in JBoss JSF bean