Ce qui ne l'EntityManager.rincer le faire et pourquoi dois-je utiliser?
J'ai un EJB où je suis la sauvegarde d'un objet de la base de données. Dans un exemple, j'ai vu, une fois que ces données sont enregistrées (EntityManager.persister) il y a un appel à l'EntityManager.flush(); Pourquoi dois-je faire? L'objet que je suis épargne est pas fixé, et de ne pas les utiliser plus tard dans la méthode. En fait, une fois sauvé la méthode retourne et je m'attends à ce que les ressources soient libérés. (L'exemple de code n'sur une suppression de l'appeler ainsi).
if (somecondition) {
entityManager.persist(unAttachedEntity);
} else {
attachedEntityObject.setId(unAttachedEntity.getId());
}
entityManager.flush();
Vous devez vous connecter pour publier un commentaire.
Un appel à
EntityManager.flush();
va forcer les données à persister dans la base de données immédiatement commeEntityManager.persist()
ne va pas (en fonction de la façon dont l'EntityManager est configuré : FlushModeType (AUTOMATIQUE ou COMMIT) par défaut il est réglé sur AUTO et un éclat sera fait automatiquement si elle est définie à COMMETTRE l'persitence des données de la base de données sera retardée lorsque la transaction est engagé).FlushModeType
n'est pas correct: fondamentalement AUTO signifie que si vous modifiez une entité et par la suite faire une requête SELECT qui peut retourner cette entité, l'AUTO va forcer les modifications à cette entité à être vidées avant de le SÉLECTIONNER l'exécution.La
EntityManager.flush()
opération peut être utilisé dans l'écriture de toutes les modifications apportées à la base de données avant la transaction est validée. Par défaut JPA n'est normalement pas écrire les changements à la base de données jusqu'à ce que la transaction est validée. C'est normalement souhaitable, car il évite les accès de base de données, les ressources et les verrous jusqu'à ce que nécessaire. Il permet également aux écritures de base de données pour être ordonné, et par lot pour optimiser l'accès de base de données, et de maintenir des contraintes d'intégrité et d'éviter les blocages. Cela signifie que lorsque vous appelez persistent, de fusionner ou de supprimer la base de données DMLINSERT
,UPDATE
,DELETE
n'est pas exécuté, jusqu'à commettre, ou jusqu'à ce qu'une chasse d'eau est déclenchée.EntityManager.persist()
fait une entité persistante alors queEntityManager.flush()
exécute les requêtes 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. Tout échec de contrainte (la largeur de la colonne, types de données, de clés étrangères) seront connus à cette époque.Le comportement du béton dépend de la chasse-mode AUTOMATIQUE ou de COMMETTRE.
Ainsi, lorsque vous appelez
EntityManager.persist()
, il ne fait que l'entité obtenir géré par leEntityManager
et l'ajoute (instance d'entité) à laPersistence Context
. Expliciteflush()
fera l'entité qui réside maintenant dans laPersistence Context
être déplacé à la base de données (à l'aide de SQL).Sans flush(), ce (déplacement de l'entité de
Persistence Context
à la base de données) qui va se passer lors de la Transaction à laquelle le présentPersistence Context
est associée est engagé.