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