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。在网上搜索这个问题也没有找到类似的案例和解决方案
以前有没有人经历过类似的事情并找到了解决方法
# 1 楼答案
请注意:我们今天遇到了同样的问题,结果发现有人将EJB标记为TransactionAttributeType。不支持,方法为TransactionAttributeType。必需,导致em.merge因缺少事务而失败
# 2 楼答案
你确定你用@Stateless注释了bean,还是用xml注册了它
尝试将事务的注释添加到代码中,这可以帮助您:
但这似乎很奇怪,因为如果不显式设置,这是默认值
# 3 楼答案
找到了丢失的链接
这确实是一个缺失的事务,但解决方案不是使用EntityManager来处理它,而是添加一个注入的UserTransaction
感谢所有的建议,不知何故,超过100个角落导致了这个解决方案
# 4 楼答案
我知道这是一个老问题,但以防有人像我一样偶然发现
试试看
这就是我们在所有@Stateful bean中使用的内容
如果您使用的是Seam,那么还可以使用
@Transactional(TransactionPropagationType.REQUIRED)
注释