Hibernate事务:这段代码有什么意义?

时间:2017-03-17 10:11:39

标签: java hibernate transactions try-catch-finally

在我的项目中,以下代码用于管理hibernate事务:

public void someMethod() {
    Session session = HibernateSessionFactory.getSession();
    Transaction tx = session.beginTransaction();
    try {
        session.save(something);
    } catch (Exception e) {
        tx.rollback();
        logger.error("error", e);
        throw new EJBException(e);
    } finally {
        try {
            tx.commit();
        } catch (Exception e) {
            tx.rollback();
            logger.error("error", e);
        } finally {
            session.close();
        }
    }
}

他们告诉我这样做是为了确保在方法结束时连接已正确关闭。但是我不明白在finally块中进行提交/回滚的意义。

是否存在证明这种方法合理的真正原因,或者更简单地做一些事情,就像这样?

public void simplerMethod() {
    Session session = HibernateSessionFactory.getSession();
    Transaction tx = session.beginTransaction();
    try {
        session.save(something);
        tx.commit();
    } catch (Exception e) {
        tx.rollback();
        logger.error("error", e);
        throw new EJBException(e);
    } finally {
        session.close();
    }
}

1 个答案:

答案 0 :(得分:1)

应该尝试,原因有两个:

如果除了HibernateException之外的某些异常或错误,您将提交会话,并且您几乎肯定不想这样做

调用回滚后,您将调用commit。我无法记住Hibernate是否允许你这样做(通过默默地忽略回滚),但至少它是丑陋的。每个会话都应该提交或回滚。