2

プロジェクトを最新の spring および hibernate リリース (spring 3.2.1 および hibernate 4.1.9) にアップグレードしましたが、互換性がないようです。変更の 1 つは、Spring の jdbc フレームワークの一部です。

public <T> T execute(StatementCallback<T> action) throws DataAccessException {
    Assert.notNull(action, "Callback object must not be null");

    Connection con = DataSourceUtils.getConnection(getDataSource());
    Statement stmt = null;
    try {
        Connection conToUse = con;
        if (this.nativeJdbcExtractor != null &&
                this.nativeJdbcExtractor.isNativeConnectionNecessaryForNativeStatements()) {
            conToUse = this.nativeJdbcExtractor.getNativeConnection(con);
        }
        stmt = conToUse.createStatement();
        applyStatementSettings(stmt);
        Statement stmtToUse = stmt;
        if (this.nativeJdbcExtractor != null) {
            stmtToUse = this.nativeJdbcExtractor.getNativeStatement(stmt);
        }
        T result = action.doInStatement(stmtToUse);
        handleWarnings(stmt);
        return result;
    }
    catch (SQLException ex) {
        // Release Connection early, to avoid potential connection pool deadlock
        // in the case when the exception translator hasn't been initialized yet.
        JdbcUtils.closeStatement(stmt);
        stmt = null;
        DataSourceUtils.releaseConnection(con, getDataSource());
        con = null;
        throw getExceptionTranslator().translate("StatementCallback", getSql(action), ex);
    }
    finally {
        JdbcUtils.closeStatement(stmt);
        DataSourceUtils.releaseConnection(con, getDataSource());
    }

Hibernate 4.1.9 は jdbc ステートメントをプロキシするようになり、例外コンバーターが開始され、チェックされた例外ではなく実行時例外がスローされます。たとえば、SQLException の代わりに実行時例外がスローされるようになりました - SQLGrammerException。

春はおそらくこの休止状態の変更を処理する必要がありますよね?

編集

Hibernate フォーラム、Hibernate Jira フォーラム、開発メーリング リストで議論しました。彼らは、これがメジャー リリース (4.x) であるため、このような互換性の問題が予想されると主張しています。問題を解決するためにコードを更新するようクライアントに依頼します。

春のジラ フォーラムに同じ問題を投稿しましたが、現在議論中です。

他の人がこの問題にどのように取り組んでいるのだろうか!

4

1 に答える 1

0

Spring は、このためのパッチを追加することに同意します。おそらく 4.x で。現在言及されている回避策の1つは

当面の良い解決策は、PersistenceExceptionTranslationPostProcessor を定義し、JDBC アクセス クラスに @Repository アノテーションを付けることです。これにより、Hibernate LocalSessionFactoryBean が自動検出され、それを使用して、ケースで JDBC 呼び出しからスローされた Hibernate 例外階層に基づいて例外が変換されます。同じポストプロセッサが Hibernate API の使用 (つまり、Hibernate にアクセスするクラスでの sessionFactory.getCurrentSession() の使用) にも適用できます。

@Repository アノテーションを使用してクラスにアクセスするすべての jdbc をマークすることは、このケースでは実際的ではない可能性があるため、私はこれを試していません。

于 2013-04-08T07:33:57.260 に答える