【问题标题】:Getting the field and table name that caused an exception from a SQL Exception object从 SQL Exception 对象获取导致异常的字段和表名
【发布时间】:2010-10-24 04:27:50
【问题描述】:

我在我的项目中使用 Hibernate JPA 和 Spring。假设如果我尝试插入具有重复键值的记录,插入查询将引发异常。

现在,是否可以在运行时从 SQL Exception 对象中获取表名、字段名和可能的异常原因!?

【问题讨论】:

    标签: java sql hibernate spring jpa


    【解决方案1】:

    SQLExceptions 往往只是包装数据库错误,如果它包含在您的数据库抛出的错误中,您只能获得此类信息。根据我调试 hibernate 和 JDBC 的经验,我敢说这个问题的答案通常是“否”,但也可能有例外。

    【讨论】:

      【解决方案2】:

      hibernate 将 SQLException 包装为 JDBCException 并尝试使用附加到 SessionFactory 的 SQLExceptionConverter 将其转换为更有意义的完整异常,例如 ConstraintViolationException。

      SQLException sqlException = ((JDBCException)ex).getSQLException(); 
      

      【讨论】:

        【解决方案3】:

        正如其他答案所提到的,大多数时候您仅限于数据库提供的内容。但是在某些情况下,Hibernate 可以告诉您问题 - 它不会是表和字段,而是实体和属性

        例如,如果您尝试在列中放置太大的值,您可以使用:

        try {
            entityManager.persist(object);
        
        } catch (InvalidStateException e) {
        
            log.info("Caught Hibernate exception: #0", e.getClass().getName());
        
            InvalidValue[] invalidValues = e.getInvalidValues();
        
            for(InvalidValue invalidValue : invalidValues) {
                log.info("Invalid Property #0 has value: #1", invalidValue.getPropertyName(), invalidValue.getPropertyName());
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2018-11-11
          • 2016-08-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-11-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多