Quelle est la différence entre persist () et merge () dans Hibernate?
persist()
peut créer une requête UPDATE & INSERT, par exemple:
SessionFactory sef = cfg.buildSessionFactory();
Session session = sef.openSession();
A a=new A();
session.persist(a);
a.setName("Mario");
session.flush();
dans ce cas, la requête sera générée comme ceci:
Hibernate: insert into A (NAME, ID) values (?, ?)
Hibernate: update A set NAME=? where ID=?
donc la persist()
méthode peut générer une insertion et une mise à jour.
Maintenant avec merge()
:
SessionFactory sef = cfg.buildSessionFactory();
Session session = sef.openSession();
Singer singer = new Singer();
singer.setName("Luciano Pavarotti");
session.merge(singer);
session.flush();
Voici ce que je vois dans la base de données:
SINGER_ID SINGER_NAME
1 Ricky Martin
2 Madonna
3 Elvis Presley
4 Luciano Pavarotti
Maintenant, mettez à jour un enregistrement en utilisant merge()
SessionFactory sef = cfg.buildSessionFactory();
Session session = sef.openSession();
Singer singer = new Singer();
singer.setId(2);
singer.setName("Luciano Pavarotti");
session.merge(singer);
session.flush();
Voici ce que je vois dans la base de données:
SINGER_ID SINGER_NAME
1 Ricky Martin
2 Luciano Pavarotti
3 Elvis Presley
Réponses:
La spécification JPA contient une description très précise de la sémantique de ces opérations, mieux que dans javadoc:
la source
persist
vsmerge
?Cela vient de
JPA
. D'une manière très simple:persist(entity)
doit être utilisé avec des entités totalement nouvelles, pour les ajouter à la base de données (si l'entité existe déjà dans la base de données, il y aura un lancer EntityExistsException).merge(entity)
doit être utilisé pour remettre l'entité dans le contexte de persistance si l'entité a été détachée et modifiée.la source
Persist ne doit être appelé que sur les nouvelles entités, tandis que la fusion est destinée à rattacher les entités détachées.
Si vous utilisez le générateur attribué, l' utilisation de merge au lieu de persist peut entraîner une instruction SQL redondante , affectant ainsi les performances.
En outre, appeler la fusion pour les entités gérées est également une erreur car les entités gérées sont automatiquement gérées par Hibernate et leur état est synchronisé avec l'enregistrement de la base de données par le mécanisme de vérification sale lors du vidage du contexte de persistance .
la source
La différence la plus importante est la suivante:
En cas de
persist
méthode, si l'entité à gérer dans le contexte de persistance existe déjà dans le contexte de persistance, la nouvelle est ignorée. (Rien ne s'est passé)Mais en cas de
merge
méthode, l'entité déjà gérée en contexte de persistance sera remplacée par la nouvelle entité (mise à jour) et une copie de cette entité mise à jour sera renvoyée. (à partir de maintenant, toutes les modifications doivent être apportées sur cette entité retournée si vous souhaitez refléter vos modifications dans le contexte de persistance)la source