SQL Exceptionオブジェクトから例外を引き起こしたフィールドとテーブル名を取得する
質問
プロジェクトでHibernate JPAとSpringを使用しています。キー値が重複するレコードを挿入しようとすると、挿入クエリが例外をスローします。
今、実行時にSQL例外オブジェクトからテーブル名、フィールド名、および例外の考えられる原因を取得することは可能ですか?
解決
他の回答で述べたように、ほとんどの場合、データベースから提供されたものに制限されます。ただし、場合によっては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は単にデータベースエラーをラップする傾向があるため、データベースがスローしたエラーに含まれている場合にのみ、そのような情報を取得できます。休止状態やJDBCのデバッグに関する私の経験では、この質問に対する答えは一般に「いいえ」ですが、例外があるかもしれません。
hibernateはSQLExceptionをJDBCExceptionとしてラップし、SessionFactoryにアタッチされているSQLExceptionConverterを使用してConstraintViolationExceptionのようなより完全な例外に変換しようとします。
SQLException sqlException = ((JDBCException)ex).getSQLException();
所属していません StackOverflow