Maison  >  Article  >  Java  >  Pourquoi Hibernate lève-t-il l'exception « un objet différent avec la même valeur d'identifiant était déjà associé à la session » lors de l'enregistrement d'un bean utilisateur avec des collections imbriquées, et comment

Pourquoi Hibernate lève-t-il l'exception « un objet différent avec la même valeur d'identifiant était déjà associé à la session » lors de l'enregistrement d'un bean utilisateur avec des collections imbriquées, et comment

Susan Sarandon
Susan Sarandonoriginal
2024-10-30 16:08:02286parcourir

Why does Hibernate throw the

Hibernate : Gestion des exceptions avec des identifiants d'objet en double

Le message d'erreur "Hibernate : un objet différent avec la même valeur d'identifiant était déjà associé au session" se produit lorsqu'Hibernate rencontre un objet avec un identifiant existant déjà associé à la session en cours. Cela peut survenir lors d'une tentative de sauvegarde ou de mise à jour d'un objet déjà présent dans la session, entraînant un conflit.

Dans le code fourni :

<code class="java">public E save(E e) {
    Session session = null;
    try {
        session = sessionFactory.openSession();
        log.debug("session="+session.hashCode()+" save "+e);
        session.saveOrUpdate(e);  //here throws exception 
        session.flush();
    }
    catch (Exception e1) {
        log.err("Cannot open hibernate session "+ e1.getMessage()+" cause : "+e1.getCause());
        e1.printStackTrace();
    }
    finally { if ( session != null ) session.close(); session = null;}
    return e ;
}</code>

L'exception est levée lors de la tentative pour saveOrUpdate un bean utilisateur. La cause du problème semble être que le bean utilisateur contient une liste de beans groupe, qui à leur tour ont une liste de rôles. Lors de l'enregistrement du bean utilisateur, Hibernate tente d'enregistrer les rôles deux fois : une fois dans le cadre des beans de groupe et de nouveau dans le cadre de la liste des rôles du bean utilisateur.

userbean#1
|---|-----------***userbean.groups
|     |     groupbean#1
|     |         groupbean.roles
|     |             rolebean#1  # save relebean#1 the first time
|     |             ---done rolebean#1
|     |         ------done all rolebeans of group.roles
|     |     ---done groupbean#1
|     |-----------done all groupbeans of userbean.groups
|---|-----------***userbean.roles
     |      rolebean#1          # save rolebean#1 the second time, and throws exception here!
     |      ----done rolebean#1
     |      .....
     |-----------done all rolebeans of userbean.roles

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

  • Utilisez session.merge() au lieu de session.saveOrUpdate()** : Cela indiquera à Hibernate que l'objet est déjà géré et devrait être mis à jour si nécessaire, plutôt que de le réenregistrer.
  • Assurez-vous que les objets sont attachés à la session avant de les enregistrer ou de les mettre à jour : Ceci peut être réalisé en utilisant session.load() ou session .get() pour récupérer l'objet de la base de données.

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