1

私はHibernate(3.6.9.Final)を使用するSpring MVC(3.1.1.RELEASE)アプリケーションを持っています。Log4jで構成されています。

log4j.category.org.hibernate.SQL=DEBUG
log4j.logger.org.hibernate.event.def.AbstractFlushingEventListener=OFF

テーブルに行を追加しようとすると、フィールドの長さが最大サイズを超えると、ログに次の例外が表示されます。

hibernateTemplate.merge(ba);

ログで:

2012-07-06 15:22:35,546 ERROR [org.hibernate.util.JDBCExceptionReporter] - <ERROR: value `too long for type character varying(70)>`

しかし一方で、私のコードでは、このDataAccessException例外だけをキャッチできます。

Could not execute JDBC batch update; SQL [insert into T_MYTABLE (BA_NUMBER, USR_ID, BA_ID) values (?, ?, ?)]; nested exception is org.hibernate.exception.DataException: Could not execute JDBC batch update"}

これは私が望む例外ではありません。

アプリケーション内でログファイルからメッセージを取得する方法を知っていますか?

HibernateExceptionをキャッチしようとしましたが、成功しませんでした。

4

2 に答える 2

0

私はなんとか方法を見つけることができました:

 catch(DataAccessException e)
    {
            Throwable t = e.getCause();               
            SQLException ex = (SQLException) t.getCause();
            while(ex != null){
                 while(t != null) {
                     t = t.getCause();
                 }
                 logger.warn("SQLException="+ex.getLocalizedMessage());

                 ex = ex.getNextException();
            }
    } 

ソース:https ://forum.hibernate.org/viewtopic.php?f = 1&t = 987395&view = previous

于 2012-07-06T09:54:40.297 に答える
0

私は同じ問題に遭遇しました。これが、さまざまなラッパーと役に立たない一般的なエラーをすべてふるいにかけた後の結果です。より良い方法があるはずだと思われます。これは脆弱で、実装に固有であると感じます。

@ExceptionHandler(DataAccessException.class)
@ResponseBody
public ErrorResponse handleDataAccessException(DataAccessException e, HttpServletResponse response) {
    String errorString = null;
    Throwable t = e.getCause();      
    if(t instanceof PersistenceException) {
        t = t.getCause();
        if(t instanceof ConstraintViolationException) {
            t = t.getCause();
            if(t instanceof BatchUpdateException) {             
                SQLException sqlException = null;
                sqlException =  ((SQLException) t).getNextException();
                if(sqlException instanceof PSQLException) {
                    errorString = ((PSQLException)sqlException).getServerErrorMessage().toString();
                    log.error("Caught exception: type=\"" + sqlException.getClass().getSimpleName() + " " + errorString);
                }
            }
        }
    }
    response.setStatus(HttpServletResponse.SC_PRECONDITION_FAILED);
    ErrorResponse errorResponse = new ErrorResponse();
    Set<ResultCode> resultCodes = new HashSet<ResultCode>();
    resultCodes.add(ResultCode.SERVER_ERROR);
    errorResponse.setResultCodes(resultCodes);
    return errorResponse;
}
于 2014-04-23T23:31:45.757 に答える