Maison >Java >javaDidacticiel >Mise en veille prolongée : pourquoi `saveOrUpdate` lance-t-il `NonUniqueObjectException` lorsque vous travaillez avec des relations plusieurs-à-plusieurs ?

Mise en veille prolongée : pourquoi `saveOrUpdate` lance-t-il `NonUniqueObjectException` lorsque vous travaillez avec des relations plusieurs-à-plusieurs ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-28 18:53:021002parcourir

 Hibernate: Why Does `saveOrUpdate` Throw `NonUniqueObjectException` When Working with Many-to-Many Relationships?

Hibernate : Confusion avec plusieurs objets de même identité

Problème :

Lors de la tentative de enregistrez ou mettez à jour un objet à l'aide de la méthode saveOrUpdate d'Hibernate, une exception est levée :

org.hibernate.NonUniqueObjectException : un objet différent avec la même valeur d'identifiant était déjà associé à la session

Contexte :

Le problème survient lorsqu'un objet, tel qu'un RoleBean, est affecté à plusieurs entités, telles qu'un UserBean et un GroupBean, au sein de la même transaction. Cela peut se produire lorsque l'objet a une relation plusieurs-à-plusieurs.

Par exemple, dans le scénario donné, RoleBean#1 est initialement attribué à GroupBean#1. Lorsque vous tentez de l'ajouter à UserBean#1 au cours de la même session, l'exception est rencontrée.

Résolution :

La cause de l'exception est l'existence de deux instances de l'objet RoleBean au sein de la session. Une instance est directement associée au UserBean, tandis que l'autre est indirectement associée via le GroupBean.

Pour résoudre ce problème, envisagez les options suivantes :

  1. Utilisez plutôt la fusion. de saveOrUpdate : L'opération de fusion suppose que toutes les modifications apportées à une instance détachée renvoyée par Hibernate doivent être fusionnées dans la base de données, quelle que soit son identité. Cependant, si l'objet cible a été modifié entre-temps, la fusion peut entraîner une perte de données.
  2. Assurez-vous que la même instance de RoleBean est utilisée tout au long de la transaction : Ceci peut être réalisé en procédant soigneusement en attribuant l'instance correcte au UserBean et au GroupBean. En conservant une seule instance, vous évitez de créer des objets en double.
  3. Envisagez d'utiliser la méthode de fusion de JPA : JPA fournit une méthode de fusion qui se comporte de la même manière que la fusion d'Hibernate. Cela suppose que toutes les modifications apportées à l'instance détachée doivent être fusionnées dans la base de données.

En implémentant l'une de ces approches, vous pouvez résoudre l'exception et garantir que les objets ayant la même identité sont correctement traités. au cours d'une seule session Hibernate.

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