在我的项目中,以下代码用于管理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();
}
}
答案 0 :(得分:1)
应该尝试,原因有两个:
如果除了HibernateException之外的某些异常或错误,您将提交会话,并且您几乎肯定不想这样做
调用回滚后,您将调用commit。我无法记住Hibernate是否允许你这样做(通过默默地忽略回滚),但至少它是丑陋的。每个会话都应该提交或回滚。