2010-08-31 19 views
9

Possible Duplicate:
Hibernate: different object with the same identifier value was already associated with the sessionHibernate Fehler: org.hibernate.NonUniqueObjectException: ein anderes Objekt mit dem gleichen Kennungswert wurde bereits mit der Sitzung verknüpft

ich fast das gleiche Problem bekommen habe, wie die user.

In meiner Situation lade ich eine Entität von db, ich konvertiere diese Entität in ein DataTransferObject, dann möchte ich ein Attribut bearbeiten, danach wandle ich es wieder in ein entityObject, dann aktualisiere ich diese Entität und Hibernate wirft folgenden Fehler :

Hibernate Error: org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session 

Offenbar ist das Problem, dass das Objekt, das ich von db abrufen die gleiche ID wie das habe ich (wie es sein sollte), aber das sind nicht die gleichen Objekte aktualisieren möchten!

Wie das zu verwalten? Vielen Dank für die Hilfe ...

Antwort

24

Ihr Problem ist, dass das Objekt, das Sie zuvor noch in Ihrer Hibernate Sitzung geladen existiert. Ich sehe zwei Möglichkeiten, damit umzugehen.

1.) erzählen der Hibernate-Session Ihr geändertes Objekt mit dem in der Sitzung

session.merge(object) 

2.) treten das alte Objekt aus der Sitzung zu verschmelzen, bevor Sie das aktualisierte Objekt, um die Sitzung zu schreiben. session.clear() könnte funktionieren.

+2

merge() hat nicht für mich funktioniert. Ich versuchte clear() und vertreiben (Objekt) mit Erfolg – Silentbang

+0

@Silentbang. Ja, ich musste sowohl 'clear()' als auch 'evict (object)' machen. Scheint so, als ob der eine oder andere alleine arbeiten müsste, aber beide brauchen. –

2

wählen, ob sie ein:

1 - Sie die Sitzung, nachdem das Unternehmen Laden schließen und neue Sitzung für die Aktualisierung öffnen

2 - stattdessen neue Entität zu schaffen für die Aktualisierung benutze das alte und editiere es.

3 - Ihre erste Einheit von Sitzung lösen - session.evict(myEntity)

+0

Vielen Dank für Ihre Ideen, aber ich möchte die Sitzung nicht schließen und meine Architektur lässt mich das alte Objekt (neben viel Mühe) nicht aktualisieren – Sven

+0

@Sieben können Sie Entität von Sitzung trennen? – mhshams

+0

funktioniert nicht: javax.servlet.ServletException: org.hibernate.SessionException: Sitzung ist geschlossen! – Sven

0

Jenseits nur clear() auf der Sitzung aufrufen, es klingt wie Sie ein Problem mit der Art und Weise haben könnten Sie Hibernate verwenden:

Apparently, the problem is that the object I retrieve from db has the same id as the one I want to update (like it should be) BUT those are not the same objects!

Sie meinen Sie sagen, dass Sie zwei getrennte Einheiten haben, die die gleiche haben ICH WÜRDE? Wenn dies der Fall ist, sollten Sie ein anderes Feld finden, das verschiedene Entitäten eindeutig identifiziert.

+0

Nein, sie sind die gleichen logischen Objekte/die gleichen Entitäten, aber Java gibt ihnen verschiedene Objekt-IDs – Sven

+0

Wie werden die '' generiert? Welches Schema verwendest du? –

11

Dies ist ein sehr häufiges Problem mit Hibernate. Selbst wenn Sie es aus der Sitzung löschen, bleibt das Objekt in Hibernate PersistanceContext und Sie haben das gleiche Problem. Das Problem kommt auch von der Tatsache, dass session.contains Objektgleichheit verwendet, und nicht equals(), um das Objekt zu vergleichen ...

Die Geschichte ist folgende: Sie haben Objekt A und Objekt B, die das gleiche logische Objekt sind , aber zwei verschiedene Objekte in deinem Java-Heap. und du hast vor langer Zeit etwas mit Objekt A in der Sitzung gemacht.

Jetzt, wenn Sie session.delete(B) tun, erhalten Sie die Ausnahme, weil Sie versuchen, ein Objekt zu löschen, das den gleichen Primärschlüssel wie A hat, aber nicht A.

Die Lösung ist einfach:

Object findAAgain=session.merge(B); 
session.delete(findAAgain); 

die Zusammenführung gibt die Instanz des Objekts zuerst in der Sitzung haben.

Verwandte Themen