JPA 异常处理

JPA exception handling

我是 运行 某个从 for 循环向数据库中插入新元素的进程。我正在使用 JPA (Eclipselink),有时转换状态会出现问题。是这样的:

  1. 其中一个 INSERTS 不起作用(主键重复)
  2. 之后所有插入都会失败(异常描述:事务当前处于活动状态)。

 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()之前,检查交易是否活跃,只有不活跃才调用begin();否则,创建查询并提交。

B) 在 catch 块中做一些事情。这是我的疑问……我应该调用 clear() 吗?冲洗()?关闭()?

哪个更好看? 谢谢!

ElementManager.Query 抛出的异常不会回滚活动事务。我在这里看到两个选项:

  1. 使用 em.getTransaction().rollback().
  2. 在 catch 子句中自行回滚事务
  3. 不要使用查询插入数据,而是使用基于 EntityManager.persist 首选 方式,其异常会导致自动回滚(在您的特定情况下,这将导致 javax.persistence.EntityExistsException).