SQL Exceptionオブジェクトから例外を引き起こしたフィールドとテーブル名を取得する

StackOverflow https://stackoverflow.com/questions/829424

質問

プロジェクトで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(); 
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top