我有一个使用EclipseLink JPA的Web服务方法。此方法基本上将数据插入数据库。就像是 :
public void insert(parameters....)
{
em.getTransaction().begin();
em.persist(employee);
em.getTransaction().commit();
// em.close();
}
现在在客户端,我有一个循环,每个循环执行插入操作:
for(......)
{
websrvice.insert(parameters...)
}
第一次迭代后,出现“当前没有事务”异常。
然后,我想到了在每次迭代之后放置一个
Thread.sleep(2000)
来解决问题。从直觉上讲,这可能是因为另一个事务在完成之前试图提交而导致错误。但是我再想一想,为什么当第一个插入未完成时第二个插入甚至会开始?困惑。
最佳答案
您不应该在交易结束时关闭实体经理。
删除此行:
em.close();
http://docs.oracle.com/javaee/6/api/javax/persistence/EntityManager.html#close()
“关闭由应用程序管理的实体管理器。调用close方法后,EntityManager实例以及从中获取的anyQuery和TypedQuery对象上的所有方法都将抛出IllegalStateException,但忘记属性,getTransaction和isOpen(将返回false)”
编辑:
尝试使用第一个getTransaction调用返回的事务,而不是两次调用此方法:
EntityTransaction transaction = em.getTransaction();
transaction.begin();
em.persist(employee);
transaction.commit();