Quelle est l’utilité de session.flush () dans Hibernate

Lorsque nous mettons à jour un enregistrement, nous pouvons utiliser session.flush() avec Hibernate. Quel est le besoin de flush() ?

Le vidage de la session oblige Hibernate à synchroniser l’état en mémoire de la Session avec la firebase database (c.-à-d. Pour écrire des modifications dans la firebase database). Par défaut, Hibernate videra automatiquement les modifications pour vous:

  • avant certaines exécutions de requêtes
  • lorsqu’une transaction est validée

Permettre de vider explicitement la Session donne un contrôle plus fin qui peut être nécessaire dans certaines circonstances (pour obtenir un ID affecté, contrôler la taille de la session, …).

Comme il est dit à juste titre dans les réponses ci-dessus, en appelant flush() nous forçons hibernate à exécuter les commandes SQL sur Database. Mais comprenez que les changements ne sont pas encore “engagés”. Donc, après avoir effectué le flush et avant de faire la validation, si vous accédez directement à la firebase database (par exemple depuis l’invite SQL) et que vous vérifiez les lignes modifiées, vous ne verrez PAS les modifications.

Cela équivaut à ouvrir 2 sessions de commandes SQL. Et les modifications effectuées dans une session ne sont pas visibles par les autres utilisateurs tant qu’elles ne sont pas validées.

Je sais seulement que lorsque nous appelons session.flush() nos instructions sont exécutées dans la firebase database mais ne sont pas validées.

Supposons que nous n’appelions pas la méthode flush() sur l’object de session et si nous appelons la méthode commit …. elle effectuera en interne l’exécution des instructions sur la firebase database, puis la validation.

commit=flush+commit (en cas de fonctionnalité)

Ainsi, je conclus que lorsque nous appelons la méthode flush () sur un object Session, elle n’est pas validée mais frappe la firebase database, exécute la requête et obtient également une restauration.

Pour commettre, nous utilisons commit () sur l’object Transaction

Le vidage de la session permet de synchroniser les données actuellement présentes dans la session avec celles de la firebase database.

Plus sur le site Hibernate:

flush() est utile, car il n’y a absolument aucune garantie sur le moment où la session exécute les appels JDBC, uniquement l’ordre dans lequel ils sont exécutés – sauf que vous utilisez flush() .

Vous pouvez utiliser flush pour forcer la réalisation et la détection des contraintes de validation à un endroit connu plutôt que lors de la validation de la transaction. Il se peut que commit soit appelé implicitement par une logique de framework, par la logique déclarative, par le conteneur ou par un template. Dans ce cas, toute exception lancée peut être difficile à attraper et à gérer (elle peut être trop élevée dans le code).

Par exemple, si vous save() un nouvel object EmailAddress, qui contient une contrainte unique sur l’adresse, vous n’obtiendrez pas d’erreur tant que vous ne vous êtes pas engagé.

L’appel de flush() force l’insertion de la ligne, en lançant une exception s’il existe un doublon.

Cependant, vous devrez annuler la session après l’exception.

Je voudrais juste regrouper toutes les réponses données ci-dessus et relier également la méthode Flush () à Session.save () pour donner plus d’importance

Hibernate save () peut être utilisé pour enregistrer l’entité dans la firebase database. Nous pouvons appeler cette méthode en dehors d’une transaction, c’est pourquoi je n’aime pas cette méthode pour enregistrer des données. Si nous l’utilisons sans transaction et que nous avons une cascade entre les entités, seule l’entité primaire est enregistrée à moins que nous vidions la session.

flush (): force la session à vider. Il est utilisé pour synchroniser les données de session avec la firebase database.

Lorsque vous appelez session.flush (), les instructions sont exécutées dans la firebase database mais ne seront pas validées. Si vous n’appelez pas session.flush () et si vous appelez session.commit (), la méthode interne commit () exécute la déclaration et la valide.

Donc commit () = flush + commit. Donc session.flush () exécute simplement les instructions dans la firebase database (mais pas les validations) et les instructions ne sont plus dans la mémoire. Cela force simplement la session à vider.

Quelques points importants:

Nous devrions éviter de sauvegarder en dehors des limites de la transaction, sinon les entités mappées ne seront pas enregistrées, ce qui entraînerait une incohérence des données. Il est très normal d’oublier de vider la session car elle ne lance aucune exception ni aucun avertissement. Par défaut, Hibernate videra automatiquement les modifications pour vous: avant certaines exécutions de requêtes lorsqu’une transaction est validée Permettre de vider explicitement la session donne un contrôle plus fin qui peut être nécessaire dans certaines circonstances (pour obtenir un identifiant, contrôler la taille de la session) )

L’appel de EntityManager#flush a des effets secondaires . Il est utilisé de manière pratique pour les types d’entités avec des valeurs d’ID générées (valeurs de séquence): un tel ID est disponible uniquement lors de la synchronisation avec la couche de persistance sous-jacente. Si cet ID est requirejs avant la fin de la transaction en cours (à des fins de journalisation par exemple), le vidage de la session est requirejs.