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();
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).
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é.
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.
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.