De temps en temps, le ISession
exécutera les instructions SQL nécessaires pour synchroniser l'état de la connexion ADO.NET avec l'état des objets conservés en mémoire. Ce processus, flush, se produit par défaut aux points suivants
- à partir de certaines invocations de
Find()
ouEnumerable()
- de
NHibernate.ITransaction.Commit()
- de
ISession.Flush()
Les instructions SQL sont émises dans l'ordre suivant
- toutes les insertions d'entités, dans le même ordre, les objets correspondants ont été enregistrés en utilisant
ISession.Save()
- toutes les mises à jour d'entité
- toutes les suppressions de collections
- toutes les suppressions, mises à jour et insertions d'éléments de collection
- toutes les insertions de collection
- toutes les suppressions d'entités, dans le même ordre que les objets correspondants ont été supprimés en utilisant
ISession.Delete()
(Une exception est que les objets utilisant la génération d'ID natif sont insérés lorsqu'ils sont enregistrés.)
Sauf lorsque vous explicitez Flush()
, il n'y a absolument aucune garantie sur le moment où la session exécute les appels ADO.NET, seulement l'ordre dans lequel ils sont exécutés . Cependant, NHibernate garantit que les ISession.Find(..)
méthodes ne renverront jamais de données périmées; ils ne renverront pas non plus les mauvaises données.
Il est possible de modifier le comportement par défaut afin que le vidage se produise moins fréquemment. La FlushMode
classe définit trois modes différents: vider uniquement au moment de la validation (et uniquement lorsque l' ITransaction
API NHibernate est utilisée), vider automatiquement à l'aide de la routine expliquée, ou ne jamais vider à moins d' Flush()
être appelé explicitement. Le dernier mode est utile pour les unités de travail de longue durée, où un ISession
est maintenu ouvert et déconnecté pendant une longue période.
...
La fin d'une session comporte quatre phases distinctes:
- vider la session
- valider la transaction
- fermer la session
- gérer les exceptions
Rinçage de la session
Si vous utilisez l' ITransaction
API, vous n'avez pas à vous soucier de cette étape. Elle sera exécutée implicitement lorsque la transaction est validée. Sinon, vous devez appeler ISession.Flush()
pour vous assurer que toutes les modifications sont synchronisées avec la base de données.
Validation de la transaction de base de données
Si vous utilisez l'API NHibernate ITransaction, cela ressemble à:
tx.Commit(); // flush the session and commit the transaction
Si vous gérez vous-même des transactions ADO.NET, vous devez manuellement Commit()
la transaction ADO.NET.
sess.Flush();
currentTransaction.Commit();
Si vous décidez de ne pas valider vos modifications:
tx.Rollback(); // rollback the transaction
ou:
currentTransaction.Rollback();
Si vous annulez la transaction, vous devez immédiatement fermer et ignorer la session en cours pour vous assurer que l'état interne de NHibernate est cohérent.
Clôture de la session
Un appel à ISession.Close()
marque la fin d'une session. L'implication principale de Close () est que la connexion ADO.NET sera abandonnée par la session.
tx.Commit();
sess.Close();
sess.Flush();
currentTransaction.Commit();
sess.Close();
Si vous avez fourni votre propre connexion, Close()
renvoie une référence à celle-ci, afin que vous puissiez la fermer manuellement ou la renvoyer au pool. Sinon, le Close()
renvoie à la piscine.