在JPA中,您如何知道持久性异常是否由特定数据库触发器引起?

时间:2014-08-04 15:21:00

标签: java sqlite exception jpa triggers

假设我有两个触发器,并在数据库中引发两个不同的错误。 当我尝试插入新实体并捕获持久性异常时,我如何区分这两个错误?我的意思是这样的:

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
    }
}

2 个答案:

答案 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)在发生异常时在消息中提供唯一的错误号,可用于识别真正的问题,例如断开触发器。