EntityManager在JBoss JSF bean的merge()上抛出TransactionRequiredException

时间:2009-07-05 18:52:11

标签: java jsf jpa jboss entitymanager

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

当调用deleteUser时,调用将传递给UserDAOBean,后者从JBoss注入一个EntityManager。

我正在使用代码

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

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

当达到此行时,我收到TransactionRequiredException:

(跳过显然无关的堆栈跟踪)

  

...

     

20:38:06,406错误[[Faces Servlet]]   servlet Faces的Servlet.service()   Servlet抛出了异常   javax.persistence.TransactionRequiredException:   EntityManager必须在a内访问   交易在   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()。begin()+ .commit()),但这失败了,因为它不允许在JBoss容器中。 UserTransaction我也没有成功。在网上搜索此问题也没有出现类似案例和解决方案。

以前是否有人经历过类似的事情并找到解决方案?

4 个答案:

答案 0 :(得分:8)

找到缺失的链接。

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

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

感谢所有建议,不知何故超过100个角落导致了这个解决方案。

答案 1 :(得分:2)

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

尝试

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

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

如果您使用的是Seam,您还可以使用@Transactional(TransactionPropagationType.REQUIRED)注释。

答案 2 :(得分:1)

你确定用@Stateless注释了bean或者用xml注册它吗?

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

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

但这看起来很奇怪,因为如果你没有明确地设置它,这是默认值。

答案 3 :(得分:0)

只是注意:我们今天遇到了同样的问题,结果有人将EJB标记为TransactionAttributeType.NOT_SUPPORTED,方法为TransactionAttributeType.REQUIRED,导致em.merge因缺少事务而失败。