我读到的关于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();
}
Run Code Online (Sandbox Code Playgroud)
出于几个原因,这种模式对我来说似乎很奇怪.首先,对于一个通常用于简化事物的框架来说,这似乎是不合理的复杂.更重要的是,如果try块中的代码抛出除了RuntimeException?之外的其他内容会发生什么?在这种情况下,Hibernate看起来好像必须能够用开放事务优雅地关闭会话,大概是通过回滚它,但如果这是真的,为什么还要打电话rollback呢?