web-dev-qa-db-fra.com

Que fait EntityManager.flush et pourquoi dois-je l’utiliser?

J'ai un EJB sur lequel je sauvegarde un objet dans la base de données. Dans un exemple que j'ai vu, une fois ces données sauvegardées (EntityManager.persist), il existe un appel à EntityManager.flush (); Pourquoi ai-je besoin de faire ça? L'objet que je sauvegarde n'est pas attaché et n'est pas utilisé plus tard dans la méthode. En fait, une fois la méthode sauvegardée, la méthode revient et je suppose que les ressources seront libérées. (L'exemple de code le fait également lors d'un appel à supprimer.)

if (somecondition) {
    entityManager.persist(unAttachedEntity);
} else {
    attachedEntityObject.setId(unAttachedEntity.getId());
}
entityManager.flush();
53
spartikus

Un appel à EntityManager.flush(); forcera immédiatement la persistance des données dans la base de données, car EntityManager.persist() ne le sera pas (selon la configuration de EntityManager: FlushModeType (AUTO ou COMMIT) par défaut, il est réglé sur AUTO et un vidage est effectué automatiquement si COMMIT est activé, la persistance des données dans la base de données sous-jacente sera retardée lorsque la transaction est validée).

46

L'opération EntityManager.flush() peut être utilisée pour écrire toutes les modifications apportées à la base de données avant la validation de la transaction. Par défaut, JPA n'écrit normalement pas les modifications dans la base de données tant que la transaction n'est pas validée. Ceci est normalement souhaitable car cela évite l'accès à la base de données, les ressources et les verrous jusqu'à ce que requis. Cela permet également de commander les écritures de base de données et de les regrouper par lots pour un accès optimal à la base de données, tout en maintenant les contraintes d'intégrité et en évitant les blocages. Cela signifie que lorsque vous appelez persist, fusionnez ou supprimez la base de données, DML INSERT, UPDATE, DELETE n'est pas exécuté, jusqu'à la validation ou jusqu'à ce qu'un vidage soit déclenché.

17

EntityManager.persist() rend une entité persistante alors que EntityManager.flush() exécute la requête sur votre base de données.

Ainsi, lorsque vous appelez EntityManager.flush(), les requêtes d'insertion/mise à jour/suppression des entités associées sont exécutées dans la base de données. Toute défaillance de contrainte (largeur de colonne, types de données, clé étrangère) sera connue à ce moment.

Le comportement concret dépend du fait que le mode affleurant est AUTO ou COMMIT.

17
Sachin Thapa

Ainsi, lorsque vous appelez EntityManager.persist(), l'entité n'est que gérée par le EntityManager et l'ajoute (instance d'entité) au Persistence Context. Un flush() explicite fera en sorte que l'entité résidant maintenant dans le Persistence Context Soit déplacée vers la base de données (à l'aide d'un SQL).

Sans flush (), cela (déplacement de l'entité de Persistence Context Vers la base de données) aura lieu lorsque la transaction à laquelle ce Persistence Context Est associé est validée.

10
Arun