10.10. Flush de la session

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 :

Les expressions SQL sont effectuées dans l'ordre suivant :

  1. insertion des entités, dans le même ordre que celui des objets correspondants sauvegardés par l'appel à Session.save()

  2. mise à jours des entités

  3. suppression des collections

  4. suppression, mise à jour et insertion des éléments des collections

  5. insertion des collections

  6. 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.