Usar HibernateTemplate para las operaciones de base de datos con hibernate

Cuando usamos hibernate, muchas veces nos empeñamos en controlar nosotros el manejo de las sesiones y esto es un error que nos puede llevar a olvidarnos de cerrar la misma.

Esto puede ocurrir por los siguientes motivos:

** Nos olvidamos de llamar a Session.close(). Esta es la mas común de las causas y para asegurarnos que siempre cerramos la sesión deberíamos usar un bloque try-finally.

** Hibernate esta haciendo Connection Pooling. También hay que tener en cuenta que cuando no usamos un DatasourceConnectionProvider hay que deshabilitar esta opción en las propiedades de hibernate.

** Estas utilizando tu propia conexión de Base de Datos. En este caso recordad que hibernate no cerrara la sesión por ti.

hibernate.connection.pool_size=0

Comentar que hibernate lanza un warning al log cuando una sesión que no ha sido cerrada es recolectada por el garbage collector.

Ponemos un ejemplo de código correcto:

Session s = SessionFactory.openSession();
try {
// do some work
s.connection().commit();
}
catch (Exception e) {
s.connection().rollback();
}
finally {
s.close().close();
}

Después de todo esto, como buena practica usaremos HibernateTemplate para que sea este el que se encargue de todo este trabajo. De esta manera no usaremos nunca un getSession() sino que llamaremos a las operaciones permitidas dentro de la clase HibernateTemplate.

Ejemplo:

DetachedCriteria detachedCriteria = DetachedCriteria.forEntityName("TipoVia");
detachedCriteria.add(Restrictions.eq("codigoVia", codigoTipoVia));
Collection matchingResults = getHibernateTemplate().findByCriteria(detachedCriteria);
return DataAccessUtils.singleResult(matchingResults);


El hibernateTemplate se configura con Spring a partir del SessionFactory que también tengamos configurado.



Comentarios