JPA 异常处理
JPA exception handling
我是 运行 某个从 for 循环向数据库中插入新元素的进程。我正在使用 JPA (Eclipselink),有时转换状态会出现问题。是这样的:
- 其中一个 INSERTS 不起作用(主键重复)
- 之后所有插入都会失败(异常描述:事务当前处于活动状态)。
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
抛出的异常不会回滚活动事务。我在这里看到两个选项:
- 使用
em.getTransaction().rollback()
. 在 catch 子句中自行回滚事务
- 不要使用查询插入数据,而是使用基于
EntityManager.persist
的 首选 方式,其异常会导致自动回滚(在您的特定情况下,这将导致 javax.persistence.EntityExistsException
).
我是 运行 某个从 for 循环向数据库中插入新元素的进程。我正在使用 JPA (Eclipselink),有时转换状态会出现问题。是这样的:
- 其中一个 INSERTS 不起作用(主键重复)
- 之后所有插入都会失败(异常描述:事务当前处于活动状态)。
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
抛出的异常不会回滚活动事务。我在这里看到两个选项:
- 使用
em.getTransaction().rollback()
. 在 catch 子句中自行回滚事务
- 不要使用查询插入数据,而是使用基于
EntityManager.persist
的 首选 方式,其异常会导致自动回滚(在您的特定情况下,这将导致javax.persistence.EntityExistsException
).