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

Kos*_*801 7 java jsf jboss jpa entitymanager

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

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

我正在使用代码

public void delete(E entity)
{
    em.remove(em.merge(entity));
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

...

20:38:06,406错误[[Faces Servlet]] servlet的Servlet.service()Faces Servlet抛出异常javax.persistence.TransactionRequiredException:EntityManager必须在org.jboss.jpa.deployment.ManagedEntityManagerFactory.verifyInTx(ManagedEntityManagerFactory)的事务中访问.java:155)atg.jboss.jpa.tx.TransactionScopedEntityManager.merge(TransactionScopedEntityManager.java:192)位于at.fhj.itm的at.fhj.itm.utils.DAOImplTemplate.delete(DAOImplTemplate.java:54). Sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)中的UserBean.delete(UserBean.java:53)

...

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

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

Kos*_*801 8

找到了缺失的链接.

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

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

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