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

Hibernate transaction: what is the point of this code?

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

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();
    }
}

应该在尝试中,原因有二:

如果出现 HibernateException 以外的异常或错误,您将提交会话,并且您几乎肯定不想这样做

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