iberck
11/5/2015 - 7:36 PM

Hibernate Sessión

Hibernate Sessión

Unit of work

Una SessionFactory es un objeto seguro entre hilos y costoso de crear pensado para que todas las hebras de la aplicación lo compartan. Se crea una sola vez, usualmente en el inicio de la aplicación, a partir de una instancia Configuration.

Una Session es un objeto de bajo costo, inseguro entre hilos que se debe utilizar una sola vez y luego se debe descartar: para un sólo pedido, una sola conversación o una sóla unidad de trabajo. Una Session no obtendrá una Connection JDBC o un Datasource a menos de que sea necesario. No consumirá recursos hasta que se utilice.

Las transacciones de las bases de datos nunca son opcionales. Toda comunicación con una base de datos tiene que ocurrir dentro de una transacción.

El patrón más común en una aplicación multiusuario cliente/servidor es sesión-por-petición. En este modelo, una petición del cliente se envia al servidor, en donde se ejecuta la capa de persistencia de Hibernate. Se abre una nueva Session de Hibernate y todas las operaciones de la base de datos se ejecutan en esta unidad de trabajo.

Una vez completado el trabajo, y una vez se ha preparado la respuesta para el cliente, se limpia la sesión y se cierra. Use una sóla transacción de la base de datos para servir la petición del cliente, dándole inicio y guardándola cuando abre y cierra la Session. La relación entre las dos es uno-a-uno y este modelo es a la medida perfecta de muchas aplicaciones.

Estados de una entidad

transient: Una nueva instancia de una clase persistente que no ha sido asociada con la sesión y no tiene una representación en la base de datos, no tiene un identificador.

persistent: Usted puede pasar una instancia de transient a persistent asociandola con la sesión. Una instancia persistente tiene una representación en la base de datos, un id y está asociada con la sesión.

Un objeto pasa a estado persistente cuando se guarda o se obtiene la instancia con cualquier método (p.e. get o a través de un query).

detached: Una vez que se cierra la sesión de hibernate, la instancia persistente se convertirá en una instancia detached.

Sesión Hibernate

Es un objeto ligero diseñado para ser inicializado múltiples veces, ningún recurso es obtenido hasta ser solicitado. Una sesión es utilizada para traer una conexión física de la base de datos, para obtener/guardar objetos persistentes, además a través de la sesión se crean las transacciones.

Los objetos session no deben mantenerse mucho tiempo abiertos porque no son thread-safe, en vez de eso debe ser obtenido/destruido conforme se vayan necesitando. La principal función de Session es de ofrecer operaciones de creación, lectura y borrado de instancias de clases de entidad.

Una sesión/transacción típica de hibernate tiene la siguiente estructura:

Session session = factory.openSession();
Transaction tx = null;
try {
   tx = session.beginTransaction();
   // do some work
   ...
   tx.commit();
}
catch (Exception e) {
   if (tx!=null) tx.rollback();
   e.printStackTrace(); 
}finally {
   session.close();
}

Si la sesión lanza una excepción, la transacción debe ser rollback y la sesión descartada.

Sesión y transacciones

Una sesión puede crear y hacer commit/rollback N transacciones.

Abrir sesiones

We should open a new session for each request in multi-threaded environment. For web application frameworks, we can choose to open a new session for each request or for each session based on the requirement.