Все, что я читал о 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
?