假设我有两个触发器,并在数据库中引发两个不同的错误。 当我尝试插入新实体并捕获持久性异常时,我如何区分这两个错误?我的意思是这样的:
try {
entityManager.getTransaction().begin();
entityManager.persist(entity);
entityManager.getTransaction().commit();
} catch (EntityExistsException exception) {
//...
} catch (PersistenceException exception) {
if(ERROR_FROM_TRIGGER_ONE) {
//do something about it
} else if(ERROR_FROM_TRIGGER_TWO) {
//do something about it
}
}
答案 0 :(得分:1)
第一次错误引发了EJBTransactionRollBack
吗?如果不只是捕获一般错误,请先虹吸到根本原因然后再适当处理
catch (Exception e) {
while(e.getCause() != null) {
e = e.getCause();
}
if(e instanceof PersistenceException) {
//do something
} else if (e instanceof EntityExistsException) {
//do something else
}
}
答案 1 :(得分:1)
JPA使用JDBC API作为低级别,并且从jdbc驱动程序的一侧,不正确的查询语法中的错误或断开的触发器之间没有区别。所以通常你不能实施这样的检查。
但是一些数据库供应商(例如Oracle)在发生异常时在消息中提供唯一的错误号,可用于识别真正的问题,例如断开触发器。