Erreur Hibernate: org.hibernate.NonUniqueObjectException: un object différent avec le même identifiant a déjà été associé à la session

Dupliquer possible:
Hibernate: différents objects avec le même identifiant ont déjà été associés à la session

J’ai presque le même problème que cet utilisateur .

Dans ma situation, je charge une entité de la firebase database, je convertis cette entité en un DataTransferObject, puis je souhaite modifier un atsortingbut. Je le reconvertis ensuite en un entityObject.

Hibernate Error: org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session 

Apparemment, le problème est que l’object que je récupère de la firebase database a le même identifiant que celui que je souhaite mettre à jour (comme il se doit), MAIS ce ne sont pas les mêmes objects!

Comment gérer ça? Merci pour l’aide…

Votre problème est que l’object que vous avez précédemment chargé existe toujours dans votre session de veille prolongée. Je vois deux façons de faire face à cela.

1.) Indiquez à la session d’hibernation de fusionner votre object modifié avec celui de la session

 session.merge(object) 

2.) Lancez l’ancien object hors de la session avant d’écrire l’object mis à jour dans la session. session.clear () pourrait fonctionner.

C’est un problème très courant avec Hibernate. Même si vous le supprimez de la session, l’object restra dans Hibernate PersistanceContext et vous aurez le même problème. Le problème vient aussi du fait que session.contains utilise l’égalité d’object et non pas equals() pour comparer l’object …

L’histoire est la suivante: vous avez l’object A et l’object B, qui sont le même object logique, mais deux objects différents dans votre segment de mémoire java. et vous avez fait longtemps quelque chose avec l’object A dans la session.

Maintenant, si vous faites session.delete(B) vous obtiendrez une exception, car vous essayez de supprimer un object qui a la même clé primaire que A, mais n’est pas A.

La solution est simple:

 Object findAAgain=session.merge(B); session.delete(findAAgain); 

la fusion renvoie d’abord l’instance de l’object que vous avez dans la session.

choisissez l’un ou l’autre:

1 – vous pouvez fermer la session après avoir chargé l’entité et ouvrir une nouvelle session pour la mise à jour

2 – au lieu de créer une nouvelle entité pour la mise à jour, utilisez l’ancienne et éditez-la.

3 – détachez votre première entité de session – session.evict(myEntity)

Au-delà de simplement appeler clear() dans la session, il semblerait que vous ayez un problème avec la façon dont vous utilisez Hibernate:

Apparemment, le problème est que l’object que je récupère de la firebase database a le même identifiant que celui que je souhaite mettre à jour (comme il se doit), MAIS ce ne sont pas les mêmes objects!

Voulez-vous dire que vous avez deux entités distinctes qui ont le même identifiant? Si tel est le cas, vous devez rechercher un champ différent qui identifie de manière unique différentes entités.