0

我们最近搬到了hibernate 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();
    }
4

3 回答 3

0

在我看来,您正在通过普通 JDBC 进行报告,我认为仅将代码移植到 Work 接口没有问题。事实上,Work 接口更好,因为它看起来会关闭连接并在引发 SQL 异常时做正确的事情,所以你的代码应该更简单。

于 2012-10-11T16:28:26.723 回答
0

为什么不使用 spring 框架及其 sessionFactory 组件,我记得一旦你初始化了整个工厂,你就可以session.getCurrentSession()自动检测存在的会话或创建一个新的会话。

不再需要手动 jdbc 代码。玩得开心!

于 2012-10-11T18:48:50.610 回答
0

任何你不能使用这种方法的理由

SQLQuery query = session.createSQLQuery(sql);
query.setDate(1, acctPeriod);
query.setDate(2, geoScheme.getId());
recordCount = query.executeUpdate();

比匿名类等简单得多。这将遵循您在会话中使用的任何事务边界/自动提交(无论您每次显式打开一个新会话,还是使用 spring 来管理,等等)。

于 2012-10-11T23:05:51.860 回答