kzen.dev
  • Questions
  • Tags
  • Utilisateurs
Notifications
Récompenses
Inscription
Une fois inscrit, vous serez informé des réponses et des commentaires à vos questions.
Connectez-vous
Si vous avez déjà un compte, connectez-vous pour vérifier les nouvelles notifications.
Il y aura des récompenses pour les questions, réponses et commentaires ajoutés.
Détails
Source
Editer
Aaron Digulla
Aaron Digulla
Question

JPA EntityManager : Pourquoi utiliser persist() plutôt que merge() ?

EntityManager.merge() peut insérer de nouveaux objets et mettre à jour les objets existants.

Pourquoi voudrait-on utiliser persist() (qui ne peut que créer de nouveaux objets) ?

920 2009-07-01T16:03:59+00:00 3
Harshal Patil
Harshal Patil
Question modifiée 27 janvier 2016 в 7:39
Programmation
merge
jpa
entitymanager
persist
java-persistence-api
Cette question a 1 réponse en anglais, pour les lire connectez-vous à votre compte.
Solution / Réponse
 Mike
Mike
1er juillet 2009 в 6:28
2009-07-01T18:28:29+00:00
Détails
Source
Editer
#9219212

L'une ou l'autre de ces méthodes permet d'ajouter une entité à un PersistenceContext. La différence réside dans ce que vous faites ensuite de l'entité.

Persist prend une instance d'entité, l'ajoute au contexte et rend cette instance gérée (c'est-à-dire que les futures mises à jour de l'entité seront suivies).

Merge crée une nouvelle instance de votre entité, copie l'état de l'entité fournie, et rend la nouvelle copie gérée. L'instance que vous transmettez ne sera pas gérée (les modifications que vous apportez ne feront pas partie de la transaction - à moins que vous n'appeliez à nouveau merge).

Un exemple de code pourrait peut-être vous aider.

MyEntity e = new MyEntity();

// scenario 1
// tran starts
em.persist(e); 
e.setSomeField(someValue); 
// tran ends, and the row for someField is updated in the database

// scenario 2
// tran starts
e = new MyEntity();
em.merge(e);
e.setSomeField(anotherValue); 
// tran ends but the row for someField is not updated in the database
// (you made the changes *after* merging)

// scenario 3
// tran starts
e = new MyEntity();
MyEntity e2 = em.merge(e);
e2.setSomeField(anotherValue); 
// tran ends and the row for someField is updated
// (the changes were made to e2, not e)

Les scénarios 1 et 3 sont à peu près équivalents, mais il y a certaines situations où vous voudriez utiliser le scénario 2.

 Mr_and_Mrs_D
Mr_and_Mrs_D
Réponse modifiée 27 février 2014 в 11:56
1578
0
Sarah Vessels
Sarah Vessels
18 janvier 2012 в 9:14
2012-01-18T21:14:31+00:00
Détails
Source
Editer
#9219214

J'ai remarqué que lorsque j'utilisais em.merge, j'obtenais une instruction SELECT pour chaque INSERT, même s'il n'y avait aucun champ que JPA générait pour moi - le champ de la clé primaire était un UUID que j'avais moi-même défini. Je suis passé à em.persist(myEntityObject) et je n'ai eu que des instructions INSERT.

37
0
 logixplayer
logixplayer
20 octobre 2010 в 4:13
2010-10-20T16:13:33+00:00
Détails
Source
Editer
#9219213

Je recevais des exceptions lazyLoading sur mon entité parce que j'essayais d'accéder à une collection chargée paresseusement qui était en session.

Dans une requête séparée, je récupérais l'entité dans la session, puis j'essayais d'accéder à une collection dans ma page jsp, ce qui posait problème.

Pour pallier à ce problème, j'ai mis à jour la même entité dans mon contrôleur et je l'ai passée à mon jsp, bien que j'imagine que lorsque j'ai réenregistré en session, elle sera également accessible via SessionScope et ne lancera pas une LazyLoadingException, une modification de l'exemple 2 :

Ce qui suit a fonctionné pour moi :

// scenario 2 MY WAY
// tran starts
e = new MyEntity();
e = em.merge(e); // re-assign to the same entity "e"

//access e from jsp and it will work dandy!!
Aaron Digulla
Aaron Digulla
Réponse modifiée 21 janvier 2012 в 11:01
8
0
Communautés apparentées 1
Java 🇫🇷
Java 🇫🇷
2 utilisateurs
Discutons de Java, de ses framework et de son utilisation Retrouvez d'autres groupes de développeurs francophones sur @dev_fr
Ouvrir telegram
Ajouter une question
Catégories
Toutes
Technologie
Culture / Loisirs
Vie / Arts
Science
Professionnel
Entreprises
Utilisateurs
Tous
Nouveau
Populaire
1
Ilya Smirnov
Enregistré il y a 1 jour
2
Денис Васьков
Enregistré il y a 2 jours
3
Dima Patrushev
Enregistré il y a 4 jours
4
sirojidddin otaboyev
Enregistré il y a 1 semaine
5
Елена Гайдамамакинат
Enregistré il y a 1 semaine
DE
EL
ES
FR
ID
IT
JA
KO
LV
NL
PT
RO
RU
TR
ZH
© kzen.dev 2023
Source
stackoverflow.com
sous licence cc by-sa 3.0 avec l'attribution