0

データベース アプリケーションの JUnit テストを書いています。テスト (HSQLDB) データベースに対して実行すると、テストが失敗します。が取得したいエラーメッセージは、このエラーメッセージです。これは実際の例外であり、完全に理解しています。

org.hsqldb.HsqlException: Violation of unique constraint SYS_PK_47: duplicate value(s) for column(s) SECONDARY_ACCOUNT_ID

ただし、この情報は、テスト失敗のスタック トレースのどこにも表示されません。代わりに、エラーはSpring、Hibernate、およびJDBCを介してフィルタリングされているようで、この完全に役に立たない、情報のない「JDBC例外」が発生します。

org.springframework.orm.hibernate3.HibernateJdbcException: JDBC exception on Hibernate data access: SQLException for SQL [insert into CAACCTS (CREDIT_APPLICATION_ID, PRIMARY_ACCOUNT_NUMBER, SECONDARY_ACCOUNT_ID, SECONDARY_ACCT_NAME, SECONDARY_ADDY_ID, SECONDARY_ACCOUNT_NUMBER) values (?, ?, ?, ?, ?, ?)]; SQL state [null]; error code [0]; Could not execute JDBC batch update; nested exception is org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update
    at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:651)
    at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:104)
    at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:516)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754)
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723)
    at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:393)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:155)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.data.jpa.repository.support.LockModeRepositoryPostProcessor$LockModePopulatingMethodIntercceptor.invoke(LockModeRepositoryPostProcessor.java:92)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:90)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
    at $Proxy26.save(Unknown Source)
    [snip]

Log4J ロギングを TRACE まで設定しましたが、成功しませんでした。この元のエラーを取得する方法を誰か教えてもらえますか (この失敗したテストだけでなく、将来のテストでも同様ですか?)

HSQLDB、Spring 3、Hibernate 3.6、および JPA 2 を使用しています。IDE は Intellij IDEA です。プロジェクトは Maven ベースです。これを診断するのに必要な場合は、追加の詳細を提供させていただきます。

4

2 に答える 2

0

ルート例外にドリルダウンする 1 つの方法は、次のようなものです。

catch(Throwable t)
{
    while(t.getCause != null)
    {
        t = t.getCause();
    }
    t.printStackTrace(System.out);
}
于 2013-07-24T18:37:19.833 に答える
0

org.hibernate.JDBCExceptionをキャッチするか、Hibernate 例外がorg.hibernate.JDBCExceptionのインスタンスであるかどうかを確認する方がよいと思います。

} catch (JDBCException e) {
    logger.warn("jdbc problem", e.getSQLException());
}

また...

if (e instanceof JDBCException) {
    SQLException sqle = ((JDBCException) e).getSQLException();
}

通常、休止状態の JDBCException には、関連する DB 固有の JDBC 例外が含まれており、getSQLException() メソッドを使用して取得できます。

于 2014-06-06T16:16:08.580 に答える