有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

当调用deleteUser时,调用被传递到UserDAOBean,该UserDAOBean从JBoss注入EntityManager

我在用密码

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

删除用户(代码是JPA教程中的c&;p)。仅仅调用em.remove(entity)没有效果,仍然会导致相同的异常

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

(跳过明显不相关的堆栈跟踪内容)

...

20:38:06,406 ERROR [[Faces Servlet]] Servlet.service() for servlet Faces Servlet threw exception javax.persistence.TransactionRequiredException: EntityManager must be access within a transaction at org.jboss.jpa.deployment.ManagedEntityManagerFactory.verifyInTx(ManagedEntityManagerFactory.java:155) at org.jboss.jpa.tx.TransactionScopedEntityManager.merge(TransactionScopedEntityManager.java:192) at at.fhj.itm.utils.DAOImplTemplate.delete(DAOImplTemplate.java:54) at at.fhj.itm.UserBean.delete(UserBean.java:53) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

...

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

以前有没有人经历过类似的事情并找到了解决方法


共 (4) 个答案

  1. # 1 楼答案

    请注意:我们今天遇到了同样的问题,结果发现有人将EJB标记为TransactionAttributeType。不支持,方法为TransactionAttributeType。必需,导致em.merge因缺少事务而失败

  2. # 2 楼答案

    你确定你用@Stateless注释了bean,还是用xml注册了它

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

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

    但这似乎很奇怪,因为如果不显式设置,这是默认值

  3. # 3 楼答案

    找到了丢失的链接

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

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

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

  4. # 4 楼答案

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

    试试看

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

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

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