Spring与Hibernate 4.1.9的兼容性

时间:2013-02-04 07:33:07

标签: spring hibernate compatibility

我使用最新的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论坛上讨论过,hibernate jira论坛&amp;在dev mailing list上。他们声称,由于这是主要版本(4.x),因此预期会出现这种兼容性问题。他们要求客户更新他们的代码以解决问题。

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

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

1 个答案:

答案 0 :(得分:0)

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

  

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

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