7

我在 JBoss 5.0.1GA 上设置了一个 JSF 应用程序,以在表格中显示用户列表,并允许通过每个用户旁边的按钮删除单个用户。

当 deleteUser 被调用时,调用被传递给一个 UserDAOBean,它得到一个从 JBoss 注入的 EntityManager。

我正在使用代码

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

删除用户(代码是来自 JPA 教程的 c&p)。只是调用 em.remove(entity) 没有任何效果,仍然会导致同样的异常。

当到达这一行时,我得到一个 TransactionRequiredException:

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

...

20:38:06,406 错误 [[Faces Servlet]] Servlet.service() for servlet Faces 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。 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 处的 UserBean.delete(UserBean.java:53)

...

我已经尝试在它周围包装一个手动管理的事务(em.getTransaction().begin() + .commit()),但这失败了,因为它在 JBoss 容器中是不允许的。我在 UserTransaction 上也没有成功。在网上搜索这个问题也没有找到类似的案例和解决方案。

有没有人经历过类似的事情并找到解决方案?

4

4 回答 4

8

找到丢失的链接。

这确实是一个缺失的事务,但解决方案不是使用 EntityManager 来处理它,而是添加一个注入的 UserTransaction。

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

感谢所有以某种方式超过 100 个角落导致此解决方案的建议。

于 2009-07-07T14:45:22.880 回答
2

知道这是一个老问题,但以防有人像我一样偶然发现这个问题。

尝试

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

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

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

于 2010-01-07T23:04:33.117 回答
1

你确定你用@Stateless注释你的bean还是用xml注册它?

尝试将事务的注释添加到您的代码中,这可以帮助您:

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

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

于 2009-07-05T22:30:45.500 回答
0

只是一个说明:我们今天遇到了同样的问题,原来有人将 EJB 标记为 TransactionAttributeType.NOT_SUPPORTED 并且方法标记为 TransactionAttributeType.REQUIRED,导致 em.merge 由于缺少事务而失败。

于 2015-10-01T10:53:21.753 回答