为什么Sleep Sleeps" No Transaction目前无效" JPA

时间:2014-05-17 10:39:08

标签: java jpa

我有一个使用 EclipseLink JPA 的Web服务方法。此方法基本上将数据插入数据库。类似的东西:

public void insert(parameters....)
   {
        em.getTransaction().begin();
        em.persist(employee);
        em.getTransaction().commit();
       // em.close();
   }

现在在客户端,我有一个循环,每次迭代执行插入:

for(......) 
{ 
    websrvice.insert(parameters...)
}

在第一次迭代之后,我得到“No transaction is current active”异常。

然后我考虑在每次迭代后放一个Thread.sleep(2000)来解决问题。

直观地说,这可能是因为另一个事务在后者完成之前尝试提交而导致错误。但是我想,为什么第二次插入甚至会在第一次插入未完成时开始?困惑。

1 个答案:

答案 0 :(得分:1)

您不应在交易结束时关闭实体经理。

删除此行:

em.close();

http://docs.oracle.com/javaee/6/api/javax/persistence/EntityManager.html#close()

“关闭应用程序管理的实体管理器。在调用close方法之后,EntityManager实例上的所有方法以及从中获取的anyQuery和TypedQuery对象都将抛出IllegalStateException,除了forgetProperties,getTransaction和isOpen(将返回false) “

编辑:

尝试使用第一个getTransaction调用返回的事务,而不是两次调用此方法:

EntityTransaction transaction = em.getTransaction();
transaction.begin();
em.persist(employee); 
transaction.commit();