Maison > Java > javaDidacticiel > 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
Libérer: 2024-10-28 22:16:02
original
245 Les gens l'ont consulté

 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>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal