我正在运行某些从for循环中插入新元素到DB中的进程,我使用JPA(Eclipselink),有时会出现transation状态的问题。我使用JPA(Eclipselink),有时会出现transation状态的问题。情况是这样的。
for (Element l:e){
try{
//Should I add: if(!em.getTransaction().isActive())
em.getTransaction().begin();
em.createNativeQuery("INSERT INTO...").executeUpdate();
em.getTransaction().commit();
}
catch(Exception ep)
{
//right now I don't do anything here
}
}
我明白发生的事情是,由于1)中的提交没有成功,事务没有完成,所以下一个em.getTransaction().begin()会发现一个已经激活的事务。
我有两个想法。
A) 在em.getTransaction().begin()之前,检查transaction是否处于活动状态,只有在不活动的情况下,才调用begin();否则,创建查询并提交。
B)在捕捉块内做一些事情。我的疑问是... 我应该调用clear()? flush()? close()?
哪一个看起来更好?
抛出的异常 ElementManager.Query
不回滚当前的交易。我在这里看到两个选项。
em.getTransaction().rollback()
.EntityManager.persist
的异常会导致自动回滚(在您的特殊情况下,这将导致 javax.persistence.EntityExistsException
).