De temps en temps la Session
exécutera les expressions SQL requises pour syncrhoniser l'état de la connexion JDBC avec l'état des objets retenus en mémoire.
Ce processus, flush, arrive par défaut aux points suivants :
lors de certaines exécutions de requête
lors d'un appel à org.hibernate.Transaction.commit()
lors d'un appel à Session.flush()
Les expressions SQL sont effectuées dans l'ordre suivant :
insertion des entités, dans le même ordre que celui des objets correspondants sauvegardés par l'appel à Session.save()
mise à jours des entités
suppression des collections
suppression, mise à jour et insertion des éléments des collections
insertion des collections
suppression des entités, dans le même ordre que celui des objets correspondants qui ont été supprimés par l'appel à Session.delete()
(Une exception est que des objets utilisant la génération native
d'identifiants sont insérés lorsqu'ils sont sauvegardés.)
Excepté lorsque vous appelez flush()
explicitement, il n'y absolument aucune garantie à propos de quand la Session
exécute les appels JDBC, seulement sur l'ordre dans lequel ils sont exécutés. Cependant, Hibernate garantit que Query.list(..)
ne retournera jamais de données périmées, ni des données fausses.
Il est possible de changer le comportement par défaut, donc que le flush se produise moins fréquemment. La classe FlushMode
définit trois modes différents : flush seulement lors du commit (et seulement quand l'API Transaction
d'Hibernate est utilisée), flush automatiquement en utilisant la procédure expliquée, ou jamais de flush à moins que flush()
soit appelée explicitement. Le dernier mode est utile pour l'exécution de longues unités de travail, où une Session
est gardée ouverte et déconnectée pour un long moment (voir Section 11.3.2, « Les sessions longues et le versionnage automatique. »).
sess = sf.openSession(); Transaction tx = sess.beginTransaction(); sess.setFlushMode(FlushMode.COMMIT); // allow queries to return stale state Cat izi = (Cat) sess.load(Cat.class, id); izi.setName(iznizi); // might return stale data sess.find("from Cat as cat left outer join cat.kittens kitten"); // change to izi is not flushed! ... tx.commit(); // flush occurs sess.close();
Durant le flush, une exception peut se produire (par exemple, si une opération de la DML viole une contrainte). Puisque les exceptions de gestion impliquent une certaine compréhension du comportement transactionnel d'Hibernate, nous le traitons dans Chapitre 11, Transactions et accès concurrents.