我们最近搬到了休眠4。我们的应用程序有许多文件,其中session.connection()已被弃用。我通过这样调用替换为session.doWork():
session.doWork(new Work() {
@Override
public void execute(Connection conn) throws SQLException {
wasAuto = conn.getAutoCommit();
if(!wasAuto) {
conn.rollback(); // in case there is existing transaction
conn.setAutoCommit(true);
}
}
});
try {
return mainCallback.doInHibernate(session);
} finally {
session.doWork(new Work() {
@Override
public void execute(Connection conn) throws SQLException {
if(!wasAuto)
conn.setAutoCommit(wasAuto);
}
});
}
但正如我所说,我们有很多文件具有相同的错误。如上所述,这是最佳实践。
为了更好地理解我正在添加一个错误的文件。有人可以帮助我清除错误。
Session session = repo.getSessionFactory().openSession();
Connection connection = null;
PreparedStatement ps = null;
int recordCount = 0;
try {
connection = session.connection();
ps = connection.prepareStatement(masterSql);
ps.setDate(1,acctPeriod);
ps.setLong(2,geoScheme.getId());
recordCount = ps.executeUpdate();
long millis = System.currentTimeMillis() - start;
logger.info("END --> Generating/Running Dynamic SQL for Aggregation took "+(millis / 60000.0)+" min" );
run.addRollupMessage("Generating/Running Dynamic SQL for Aggregation took "+(millis / 60000.0)+" min" );
run.setEndDate(DateUtils.currentTimestamp());
logger.info("No of Loan groups inserted = " + recordCount);
run.addRollupMessage("No of Loan groups inserted = " + recordCount);
} catch (Exception err) {
throw new RuntimeException(" **ERROR** DURING AGGREGATION: " + err.getMessage(),err);
}
finally
{
if (ps != null) ps.close();
if (connection != null) connection.close();
if (session != null) session.close();
}
答案 0 :(得分:0)
在我看来,您正在通过普通JDBC进行报告,我没有看到将代码移植到Work界面的问题。事实上,Work接口更好,因为看起来它会关闭连接并在抛出SQL异常时做正确的事情,因此您的代码应该更简单。
答案 1 :(得分:0)
为什么不使用spring框架及其sessionFactory组件,我记得一旦你初始化整个工厂,你就可以session.getCurrentSession()
,这将自动检测现有会话或创建一个新会话。
没有更多的手动jdbc代码。很有趣!
答案 2 :(得分:0)
您无法使用此方法的任何原因
SQLQuery query = session.createSQLQuery(sql);
query.setDate(1, acctPeriod);
query.setDate(2, geoScheme.getId());
recordCount = query.executeUpdate();
比匿名类等简单得多。这将遵循您在会话中使用的任何事务边界/自动提交(无论您是每次都明确地打开一个新会话,还是使用spring来管理等等。)