关于Hibernate的所有阅读材料都指出,当发生错误时必须回滚事务并关闭会话,并且通常会给出以下代码(摘自Hibernate的文档)的某些变体作为示例:
Session sess = factory.openSession();
Transaction tx = null;
try {
tx = sess.beginTransaction();
// do some work
...
tx.commit();
} catch (RuntimeException e) {
if (tx != null) tx.rollback();
throw e; // or display error message
} finally {
sess.close();
}
对我来说,这种模式似乎有几个奇怪的地方。首先,对于一个通常旨在简化事物的框架来说,它似乎过于复杂了。更重要的是,如果try
块中的代码抛出除RuntimeException
之外的异常会发生什么?看起来Hibernate必须能够在这种情况下优雅地关闭具有打开事务的会话,可能通过回滚,但如果是这样,为什么还要调用rollback
呢?