JPA异常处理

问题描述 投票:0回答:1

我正在运行某些从for循环中插入新元素到DB中的进程,我使用JPA(Eclipselink),有时会出现transation状态的问题。我使用JPA(Eclipselink),有时会出现transation状态的问题。情况是这样的。

  1. 其中一个INSERTS不工作(主键重复)
  2. 之后,所有的插入都会失败(Exception Description: Transaction is currently active)。

 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()?

哪一个看起来更好?

java jpa eclipselink flush
1个回答
2
投票

抛出的异常 ElementManager.Query 不回滚当前的交易。我在这里看到两个选项。

  1. 在捕捉子句中自己回滚交易,使用... ... em.getTransaction().rollback().
  2. 用查询代替插入数据,使用 首选 基于 EntityManager.persist 的异常会导致自动回滚(在您的特殊情况下,这将导致 javax.persistence.EntityExistsException).
© www.soinside.com 2019 - 2024. All rights reserved.