2

我使用最新的 spring 和 hibernate 版本(spring 3.2.1 和 hibernate 4.1.9)升级了我的项目,但它们似乎不兼容。其中一项更改是 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。

Spring 可能应该处理这种休眠变化,对吧?

编辑

我在 hibernate 论坛、hibernate jira 论坛和开发邮件列表上讨论过。他们声称,由于这是一个主要版本 (4.x),因此预计会出现此类兼容性问题。他们要求客户更新他们的代码以解决问题。

我在spring jira 论坛上发布了相同的问题,目前正在讨论中。

我想知道其他人是如何解决这个问题的!

4

1 回答 1

0

Spring 同意为此添加补丁。可能在 4.x 中。现在提到的解决方法之一是

目前,一个好的解决方案可能是定义一个 PersistenceExceptionTranslationPostProcessor 并使用 @Repository 注释标记您的 JDBC 访问类。这将自动检测您的 Hibernate LocalSessionFactoryBean 并使用它来转换基于 Hibernate 异常层次结构的异常,如您的案例中从 JDBC 调用引发的那样。同样的后处理器也适用于 Hibernate API 的使用(即在你的 Hibernate 访问类中的 sessionFactory.getCurrentSession() 使用)

我没有尝试过这个,因为在我们的例子中,用@Repository 注释标记所有的 jdbc 访问类可能不切实际。

于 2013-04-08T07:33:57.260 回答