Comprendre la différence entre Persist() et Merge() dans JPA et Hibernate
Dans JPA et Hibernate, persist() et merge () les méthodes jouent un rôle essentiel dans la gestion des entités et la gestion de la persistance des données. Cependant, ils présentent des différences distinctes dans leurs comportements.
Persist()
La méthode persist(), telle que définie par la spécification JPA, fonctionne comme suit :
- Si l'entité est nouvelle et non gérée, elle devient gérée et sera enregistrée dans la base de données lorsque la transaction est validée ou vidée.
- Si l'entité est déjà gérée ou supprimée, l'entité est déjà gérée ou supprimée. L'opération est ignorée.
- Si l'entité est détachée, une exception peut être levée ou l'opération persistante peut échouer pendant le vidage ou la validation.
- Les opérations en cascade sont appliquées à toutes les entités référencées avec cascade=PERSIST ou cascade=ALL annotations.
Merge()
D'autre part, la méthode merge() a un ensemble de sémantique différent :
- Si l'entité est détachée, son état est copié vers une entité gérée préexistante avec la même identité, ou une nouvelle copie gérée est créée.
- Si l'entité est nouvelle , une nouvelle entité gérée est créée et son état est copié à partir de l'entité entrante.
- Si l'entité est supprimée, une exception est levée.
- Si l'entité est gérée, l'opération est ignorée. , mais les opérations en cascade sont toujours appliquées aux entités référencées si elles sont annotées avec cascade=MERGE ou cascade=ALL.
- L'entité fusionnée fait référence aux entités gérées pour toutes les relations annotées avec cascade=MERGE ou cascade=ALL.
- Si une entité est fusionnée avec une référence à une relation non en cascade, l'association de l'entité fusionnée renverra une référence à un objet géré avec la même identité.
Quand pour utiliser Persist() ou Merge()
En fonction de ces différences, les directives suivantes peuvent vous aider à choisir la méthode appropriée :
- Utilisez persist() lorsque vous le souhaitez pour créer une nouvelle ou mettre à jour une entité existante qui n'est pas encore gérée par le contexte de persistance.
- Utilisez merge() lorsque vous souhaitez mettre à jour une entité existante qui est déjà gérée mais qui a été modifiée en dehors du contexte de persistance. .