【发布时间】:2010-10-24 04:27:50
【问题描述】:
我在我的项目中使用 Hibernate JPA 和 Spring。假设如果我尝试插入具有重复键值的记录,插入查询将引发异常。
现在,是否可以在运行时从 SQL Exception 对象中获取表名、字段名和可能的异常原因!?
【问题讨论】:
标签: java sql hibernate spring jpa
我在我的项目中使用 Hibernate JPA 和 Spring。假设如果我尝试插入具有重复键值的记录,插入查询将引发异常。
现在,是否可以在运行时从 SQL Exception 对象中获取表名、字段名和可能的异常原因!?
【问题讨论】:
标签: java sql hibernate spring jpa
SQLExceptions 往往只是包装数据库错误,如果它包含在您的数据库抛出的错误中,您只能获得此类信息。根据我调试 hibernate 和 JDBC 的经验,我敢说这个问题的答案通常是“否”,但也可能有例外。
【讨论】:
hibernate 将 SQLException 包装为 JDBCException 并尝试使用附加到 SessionFactory 的 SQLExceptionConverter 将其转换为更有意义的完整异常,例如 ConstraintViolationException。
SQLException sqlException = ((JDBCException)ex).getSQLException();
【讨论】:
正如其他答案所提到的,大多数时候您仅限于数据库提供的内容。但是在某些情况下,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());
}
}
【讨论】: