我有一个使用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();

09-26 22:43