我在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我也没有成功。在网上搜索此问题也没有出现类似案例和解决方案。
以前是否有人经历过类似的事情并找到解决方案?
答案 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因缺少事务而失败。