私のプロジェクトでは、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はデータベースエラーのラップアップを行う傾向があります。データベースがスローしたエラーにSQLExceptionが含まれていると、そのような情報しか取得できません。私がハイバーネイトとJDBCをデバッグした経験では、この質問に対する答えは一般的に「いいえ」ですが、例外があるかもしれません。
hibernateはJDBCExceptionとしてSQLExceptionをラップし、SessionFactoryに添付されているSQLExceptionConverterを使用してConstraintViolationExceptionのような完全な例外に変換しようとします。
SQLException sqlException = ((JDBCException)ex).getSQLException();