Todo lo que leo acerca de hibernación indica que debe deshacer una transacción y cerrar la sesión cuando se produce un error, y por lo general hay una cierta variación del código siguiente (tomado de documentos de Hibernate) dada como un ejemplo:¿Qué sucede si no revierte una transacción en 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();
}
Este patrón me parece extraño por un par de razones. Primero, parece irrazonablemente complicado para un marco que generalmente está orientado a simplificar las cosas. Más importante aún, ¿qué sucede si el código en el bloque try
arroja algo más que un RuntimeException
? Parece que Hibernate debe poder cerrar con gracia la sesión con una transacción abierta en ese caso, presumiblemente volviéndolo hacia atrás, pero si eso es cierto, ¿por qué molestarse en llamar al rollback
?
¿Quién le dijo que Hibernate hace las cosas simples? :) – skaffman