我使用最新的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上发布了同样的问题,目前正在讨论中。
我想知道其他人是如何解决这个问题的!
答案 0 :(得分:0)
Spring同意为此添加补丁。 Probably in 4.x。现在提到的解决方法之一是
目前,一个好的解决方案可能是定义PersistenceExceptionTranslationPostProcessor并使用@Repository注释标记JDBC访问类。这将自动检测您的Hibernate LocalSessionFactoryBean并使用它来转换基于Hibernate异常层次结构的异常,就像在您的情况下从JDBC调用抛出的那样。同样的后处理器也适用于Hibernate API用法(即Hibernate访问类中的sessionFactory.getCurrentSession()用法)
我没有试过这个,因为在我们的例子中用@Repository注释标记所有jdbc访问类可能不实用。