Heim  >  Artikel  >  Java  >  Warum wirft Hibernate beim Speichern einer Benutzer-Bean mit verschachtelten Sammlungen die Ausnahme „Anderes Objekt mit demselben Bezeichnerwert war bereits mit der Sitzung verknüpft“ aus und wie ca

Warum wirft Hibernate beim Speichern einer Benutzer-Bean mit verschachtelten Sammlungen die Ausnahme „Anderes Objekt mit demselben Bezeichnerwert war bereits mit der Sitzung verknüpft“ aus und wie ca

Susan Sarandon
Susan SarandonOriginal
2024-10-30 16:08:02286Durchsuche

Why does Hibernate throw the

Hibernate: Ausnahmebehandlung mit doppelten Objektbezeichnern

Die Fehlermeldung „Ruhezustand: anderes Objekt mit demselben Bezeichnerwert wurde bereits mit dem verknüpft „Sitzung“ tritt auf, wenn Hibernate auf ein Objekt mit einer vorhandenen Kennung trifft, die bereits mit der aktuellen Sitzung verknüpft ist. Dies kann auftreten, wenn versucht wird, ein Objekt zu speichern oder zu aktualisieren, das bereits in der Sitzung vorhanden ist, was zu einem Konflikt führt.

Im bereitgestellten Code:

<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>

Beim Versuch wird die Ausnahme ausgelöst um eine Benutzer-Bean zu speichern oder zu aktualisieren. Die Ursache des Problems scheint darin zu liegen, dass die Benutzer-Bean eine Liste von Gruppen-Beans enthält, die wiederum eine Liste von Rollen haben. Beim Speichern des Benutzer-Beans versucht Hibernate, die Rollen zweimal zu speichern: einmal als Teil der Gruppen-Beans und erneut als Teil der Rollenliste des Benutzer-Beans.

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

Um dieses Problem zu beheben, ziehen Sie die folgenden Ansätze in Betracht :

  • Verwenden Sie session.merge() anstelle von session.saveOrUpdate()**: Dadurch wird Hibernate mitgeteilt, dass das Objekt bereits verwaltet wird und sollte bei Bedarf aktualisiert werden, anstatt es erneut zu speichern.
  • Stellen Sie sicher, dass die Objekte an die Sitzung angehängt sind, bevor Sie sie speichern oder aktualisieren: Dies kann mit session.load() oder session erreicht werden .get(), um das Objekt aus der Datenbank abzurufen.

Das obige ist der detaillierte Inhalt vonWarum wirft Hibernate beim Speichern einer Benutzer-Bean mit verschachtelten Sammlungen die Ausnahme „Anderes Objekt mit demselben Bezeichnerwert war bereits mit der Sitzung verknüpft“ aus und wie ca. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn