获取导致SQL Exception对象异常的字段和表名称

时间:2009-05-06 12:55:09

标签: java sql hibernate spring jpa

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

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

3 个答案:

答案 0 :(得分:1)

SQLExceptions倾向于只包装数据库错误,只有在数据库丢失的错误中包含这些信息时才能获得。根据我调试hibernate和JDBC的经验,我会冒这个问题的答案通常是“不”,但可能有例外。

答案 1 :(得分:1)

正如其他答案所提到的,大部分时间你都受限于数据库给出的内容。但是在某些情况下,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());
    }
}

答案 2 :(得分:0)

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

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