De vez en cuando ISession
, ejecutará las instrucciones SQL necesarias para sincronizar el estado de la conexión ADO.NET con el estado de los objetos almacenados en la memoria. Este proceso, flush, ocurre por defecto en los siguientes puntos
- de algunas invocaciones de
Find()
oEnumerable()
- de
NHibernate.ITransaction.Commit()
- de
ISession.Flush()
Las sentencias SQL se emiten en el siguiente orden
- todas las inserciones de entidades, en el mismo orden en que se guardaron los objetos correspondientes usando
ISession.Save()
- todas las actualizaciones de la entidad
- todas las eliminaciones de colecciones
- todas las eliminaciones, actualizaciones e inserciones de elementos de colección
- todas las inserciones de colección
- todas las eliminaciones de entidades, en el mismo orden en que se eliminaron los objetos correspondientes usando
ISession.Delete()
(Una excepción es que los objetos que utilizan la generación de ID nativa se insertan cuando se guardan).
Excepto cuando explícitamente Flush()
, no hay absolutamente ninguna garantía sobre cuándo la Sesión ejecuta las llamadas ADO.NET, solo el orden en que se ejecutan . Sin embargo, NHibernate garantiza que los ISession.Find(..)
métodos nunca devolverán datos obsoletos; ni devolverán los datos incorrectos.
Es posible cambiar el comportamiento predeterminado para que el vaciado ocurra con menos frecuencia. La FlushMode
clase define tres modos diferentes: solo enjuagar en el momento de la confirmación (y solo cuando ITransaction
se usa la API de NHibernate ), enjuagar automáticamente usando la rutina explicada o nunca enjuagar a menos que Flush()
se llame explícitamente. El último modo es útil para unidades de trabajo de larga duración, donde ISession
se mantiene abierto y desconectado durante mucho tiempo.
...
Terminar una sesión implica cuatro fases distintas:
- lavar la sesión
- cometer la transacción
- cerrar la sesión
- manejar excepciones
Vaciar la sesión
Si está utilizando la ITransaction
API, no necesita preocuparse por este paso. Se realizará implícitamente cuando se confirme la transacción. De lo contrario, debe llamar ISession.Flush()
para asegurarse de que todos los cambios estén sincronizados con la base de datos.
Confirmar la transacción de la base de datos
Si está utilizando la API de NHibernate ITransaction, esto se ve así:
tx.Commit(); // flush the session and commit the transaction
Si está gestionando transacciones ADO.NET usted mismo, debe realizar manualmente Commit()
la transacción ADO.NET.
sess.Flush();
currentTransaction.Commit();
Si decide no comprometer sus cambios:
tx.Rollback(); // rollback the transaction
o:
currentTransaction.Rollback();
Si revierte la transacción, debe cerrar y descartar inmediatamente la sesión actual para asegurarse de que el estado interno de NHibernate sea coherente.
Cerrando la sesión
Una llamada a ISession.Close()
marca el final de una sesión. La implicación principal de Close () es que la sesión abandonará la conexión ADO.NET.
tx.Commit();
sess.Close();
sess.Flush();
currentTransaction.Commit();
sess.Close();
Si proporcionó su propia conexión, le Close()
devuelve una referencia, para que pueda cerrarla manualmente o devolverla al grupo. De Close()
lo contrario, lo devuelve al grupo.