Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA异常处理_Java_Jpa_Eclipselink_Flush - Fatal编程技术网

Java JPA异常处理

Java JPA异常处理,java,jpa,eclipselink,flush,Java,Jpa,Eclipselink,Flush,我正在运行某个进程,该进程从for循环在DB中插入新元素。我使用的是JPA(Eclipselink),有时交易状态会出现问题。情况就是这样: 其中一个插入不起作用(主键重复) 之后,所有插入都将失败(异常描述:事务当前处于活动状态) 我知道发生的事情是,由于1)中的提交没有工作,事务没有完成,因此下一个em.getTransaction().begin()将找到一个已经处于活动状态的事务 我有两个想法: A) 在em.getTransaction().begin()之前,检查事务是否处于活动状

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

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

  • 我知道发生的事情是,由于1)中的提交没有工作,事务没有完成,因此下一个em.getTransaction().begin()将找到一个已经处于活动状态的事务

    我有两个想法:

    A) 在em.getTransaction().begin()之前,检查事务是否处于活动状态,只有在未处于活动状态时,才调用begin();否则,创建查询并提交

    B) 在挡块内做些什么。这是我的疑问。。。我应该调用clear()吗?刷新()?close()

    哪一个看起来更好?
    谢谢

    ElementManager.Query引发的异常不会回滚活动事务。我在这里看到两种选择:

  • 使用
    em.getTransaction().Rollback()
    ,在catch子句中自己回滚事务
  • 使用基于其异常导致自动回滚的
    EntityManager.persistence
    首选方法(在您的特定情况下,这将导致
    javax.persistence.EntityExistSexException
    ),而不是使用查询插入数据

  • 为什么不回滚事务以响应异常?
    EntityManager.getTransaction()
    返回一个
    EntityTransaction
    对象。请确保在此事务对象上使用了
    commit()
    rollback()
    。您使用的是JPA,但用于本机SQL插入。。为什么不直接将实体用于插入?每个事务还使用1个insert,当您遇到异常时,是否有理由不使用新的EntityManager实例?
     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
      }
     }