我在我的項目中使用Hibernate JPA和Spring。假設如果我嘗試插入具有重複鍵值的記錄,插入查詢將引發異常。從SQL異常對象獲取導致異常的字段和表名稱
現在,是否有可能在運行時從SQL Exception對象獲取表名,字段名和可能的異常原因!
我在我的項目中使用Hibernate JPA和Spring。假設如果我嘗試插入具有重複鍵值的記錄,插入查詢將引發異常。從SQL異常對象獲取導致異常的字段和表名稱
現在,是否有可能在運行時從SQL Exception對象獲取表名,字段名和可能的異常原因!
正如其他答案所提到的,大多數時候你只限於你給的數據庫。然而在某些情況下,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());
}
}
SQLExceptions傾向於只包裝數據庫錯誤,如果它包含在數據庫拋出的錯誤中,則只能獲得該類信息。根據我對調試hibernate和JDBC的經驗,我認爲這個問題的答案通常是「否」,但可能會有例外。
hibernate將SQLException封裝爲JDBCException,並試圖將其轉換爲更具意義的完全異常,如使用連接到SessionFactory的SQLExceptionConverter的ConstraintViolationException。
SQLException sqlException = ((JDBCException)ex).getSQLException();