Maison  >  Article  >  Java  >  Pourquoi est-ce que je reçois une exception « Objet en double avec le même identifiant » dans Hibernate ?

Pourquoi est-ce que je reçois une exception « Objet en double avec le même identifiant » dans Hibernate ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-28 22:16:02157parcourir

 Why am I getting a

Exception Hibernate : objet en double avec le même identifiant

Problème :

Lors de l'utilisation de session.saveOrUpdate(e) avec un objet qui a une relation avec d'autres entités, une exception peut être levée indiquant qu'un "objet différent avec la même valeur d'identifiant était déjà associé à la session."

Explication :

Cette exception se produit lorsqu'Hibernate détecte plusieurs instances de la même entité avec le même identifiant au sein d'une seule session. Voici une illustration simplifiée de la situation :

  • L'entité A (rolebean) est associée à l'entité B (userbean) et à l'entité C (groupbean).
  • Lors de l'appel de saveOrUpdate sur l'entité B, Hibernate enregistre l'entité A dans le cadre des relations de l'entité B.
  • Plus tard, lors de l'appel de saveOrUpdate sur l'entité C, Hibernate tente de sauvegarder à nouveau l'entité A, mais en tant qu'instance distincte.

Solution :

La solution dépend du comportement souhaité :

1. Entretenir des relations via la fusion :

Pour éviter les instances en double, utilisez session.merge(e) au lieu de saveOrUpdate. La fusion suppose que l'instance détachée de l'entité (l'entité A dans ce cas) doit être attachée à la session et que toutes les modifications doivent être fusionnées dans la version jointe.

2. Assurer la cohérence de l'affectation :

Si vous souhaitez continuer à utiliser saveOrUpdate, assurez-vous que la même instance de l'entité est attribuée à toutes les entités associées. Cela signifie que lors de l'ajout de l'entité A aux relations de l'entité B et de l'entité C, la même instance de l'entité A doit être utilisée.

Exemple :

<code class="java">// Ensuring the same instance of rolebean is assigned to both userbean and groupbean
rolebean.setUserbean(userbean);
groupbean.getGroups().add(rolebean);</code>

Remarque :

Le correctif spécifique dépend du code qui effectue la mission. Il est essentiel de s'assurer que la même instance de l'entité est utilisée lors de l'établissement des relations pour éviter le problème d'objet en double.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn