Hibernate-Fehler: org.hibernate.NonUniqueObjectException: Ein anderes Objekt mit demselben Bezeichnerwert war bereits mit der Sitzung verknüpft
Habe ich zwei user-Objekte, und während ich versuchen, speichern Sie das Objekt mithilfe
session.save(userObj);
Ich erhalte die folgende Fehlermeldung:
Caused by: org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session:
[com.pojo.rtrequests.User#com.pojo.rtrequests.User@d079b40b]
Erstelle ich die session mit
BaseHibernateDAO dao = new BaseHibernateDAO();
rtsession = dao.getSession(userData.getRegion(),
BaseHibernateDAO.RTREQUESTS_DATABASE_NAME);
rttrans = rtsession.beginTransaction();
rttrans.begin();
rtsession.save(userObj1);
rtsession.save(userObj2);
rtsession.flush();
rttrans.commit();
rtsession.close(); //in finally block
Ich auch versucht dabei die session.clear()
vor dem speichern noch kein Glück.
Dies ist das erste mir immer die session-Objekt aus, wenn ein Userwunsch kommt, so bin ich immer, warum sagt aus, dass das Objekt vorhanden ist in der session.
Irgendwelche Vorschläge?
Kommentar zu dem Problem
Weiterführender link stackoverflow.com/a/32270237/1793718
Hier ist ein weiterer wunderbarer thread, der geholfen hat, zu beheben mein Problem getj2ee.over-blog.com/...
InformationsquelleAutor der Frage harshit | 2009-07-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich habe diesen Fehler viele Male, und es kann sehr schwer auf die Spur...
Im Grunde, was hibernate ist zu sagen, dass Sie haben zwei Objekte, die den gleichen Bezeichner (gleichen Primärschlüssel), aber Sie sind nicht das gleiche Objekt.
Ich würde vorschlagen, Sie brechen Ihr code, d.h. auskommentieren bits, bis der Fehler geht Weg, und dann setzen Sie den code zurück, bis er kommt zurück und Sie sollten den Fehler zu finden.
Es meist geschieht über cascading spart, wo es eine Kaskade speichern zwischen Objekt A und B, sondern Objekt B wurde bereits im Zusammenhang mit der Sitzung, aber nicht auf der gleichen Instanz von B.
Was primary key-generator verwenden Sie?
Der Grund warum ich Frage ist dieser Fehler im Zusammenhang mit der, wie du sagst Ruhezustand zu ermitteln, den persistenten Zustand eines Objekts (d.h. ob ein Objekt persistent ist oder nicht). Der Fehler könnte passiert sein, weil hibernate versucht zu bestehen und Objekt, das ist schon hartnäckig. In der Tat, wenn Sie speichern unter verwenden, hibernate werde versuchen, und speichern Sie das Objekt, und vielleicht gibt es bereits ein Objekt mit demselben Primärschlüssel mit der Sitzung verknüpft.
Beispiel
Vorausgesetzt, Sie haben ein hibernate-Objekt-Klasse für eine Tabelle mit 10 Zeilen basierend auf dem Primärschlüssel-Kombination (Spalte 1 und Spalte 2). Nun, Sie entfernt haben, die 5 Zeilen aus der Tabelle zu einem bestimmten Zeitpunkt. Nun, wenn Sie versuchen, fügen Sie die gleichen 10 Zeilen wieder, während hibernate versucht, darauf zu bestehen die Objekte in der Datenbank 5 Zeilen, die wurden bereits entfernt wird, Hinzugefügt werden, ohne Fehler. Jetzt die restlichen 5 Zeilen, die bereits da sind, wirft diese exception.
So der einfache Ansatz wäre, die überprüfen, ob Sie aktualisiert/entfernt einen beliebigen Wert in einer Tabelle, die Teil von etwas, und später werden Sie versuchen, legen Sie die gleichen Objekte wieder
InformationsquelleAutor der Antwort Michael Wiles
Dies ist nur ein Punkt, wo hibernate macht mehr Probleme als es löst.
In meinem Fall sind es viele Objekte mit dem gleichen Bezeichner 0, weil Sie neu sind und noch keine haben. Die db generiert. Irgendwo habe ich gelesen, dass die 0-Signale-Id nicht gesetzt. Die intuitive Art und Weise zu persistieren, ist die Iteration über Sie und sagen, die hibernate zum speichern der Objekte. Aber Sie können das nicht - "natürlich sollten Sie wissen, dass hibernate funktioniert dies und das Weg, deshalb müssen Sie..."
So, jetzt kann ich versuchen zu ändern-Ids zu Lange statt lang und schau mal ob es dann funktioniert.
Am Ende ist es einfacher, es zu tun mit einem einfachen mapper, indem Sie Ihre eigenen, weil hibernate ist nur eine zusätzliche intransparenten Belastung.
Ein weiteres Beispiel: der Versuch, Parameter zu Lesen aus einer Datenbank, und speichern Sie Sie in einem anderen Kräfte, die Sie tun fast alle arbeiten manuell. Aber wenn Sie es trotzdem tun, Einsatz von hibernate ist nur zusätzliche Arbeit.
InformationsquelleAutor der Antwort Hein
Verwenden
session.evict(object);
Die Funktion derevict()
Methode zum entfernen der Instanz aus der session-cache. So zum ersten mal speichern das Objekt speichern Objekt durch Aufrufsession.save(object)
- Methode vor dem entfernen des Objekts aus dem cache. In der gleichen Weise update-Objekt durch Aufrufsession.saveOrUpdate(object)
odersession.update(object)
vor dem Aufruf von evict().InformationsquelleAutor der Antwort Rahul N
Als jemand, der schon oben, ich lief in dieses problem, wenn ich hatte
cascade=all
auf beide enden einerone-to-many
Beziehung, gehen wir also davon aus A --> B (eins-zu-viele aus und viele-zu-eins aus B) und wurde aktualisiert Instanz von B in A und dann ruft saveOrUpdate(A) , dies führte zu einer kreisförmigen speichern, Anfrage ich.e speichern Eines Trigger speichern von B, die Trigger speichern... und in der Dritten Instanz als entity( A) wurde versucht, die Hinzugefügt werden, um die sessionPersistenceContext die duplicateObject exception geworfen wurde.Ich konnte es lösen durch entfernen der Kaskade von einem Ende.
InformationsquelleAutor der Antwort redzedi
Dies kann passieren, wenn Sie verwendet haben, gleichen session-Objekt zum Lesen und schreiben. Wie?
Sagen Sie, dass Sie erstellt haben, in einer Sitzung.
Lesen Sie einen Datensatz aus der employee-Tabelle mit Primärschlüssel Emp_id=101
Jetzt haben Sie den Datensatz geändert in Java.
Und Sie gehen, um zu speichern Sie die Employee-Datensatz in der Datenbank.
wir haben nicht eine geschlossene Sitzung abzuhalten, hier überall.
Wie das Objekt, das gelesen wurde, bleiben auch in der Sitzung. Es Konflikte mit dem Objekt, das wir wollen, zu schreiben. Daher kommt dieser Fehler.
InformationsquelleAutor der Antwort Prashant Bari
Holen Sie das Objekt in die session, hier ein Beispiel:
InformationsquelleAutor der Antwort user372467
Ich lief in dieses problem, indem Sie:
Ich entschloss mich, es durch das Spülen der Ergebnisse nach dem löschen und leeren des cache vor dem speichern des neuen Objekts
InformationsquelleAutor der Antwort wbdarby
Ich lief auch dieses problem und hatte eine harte Zeit, den Fehler zu finden.
Das problem, das ich hatte, war folgende:
Das Objekt gelesen wurde, ein Dao mit einer anderen hibernate-session.
Um dies zu vermeiden, Ausnahme, kommen Sie einfach wieder-Lesen Sie das Objekt mit dem dao geht, die zum speichern/aktualisieren dieses Objekts später.
also:
Hoffen, dass sparen die Menschen viel Zeit!
InformationsquelleAutor der Antwort Frithjof
Sind Ihre Id-mappings korrekt? Wenn die Datenbank ist verantwortlich für die Erstellung der Id durch einen Bezeichner, müssen Sie Ihre Karte Benutzerobjekt an, dass ..
InformationsquelleAutor der Antwort cwap
Prüfen Sie, ob Sie vergessen hat, @GenerateValue für die @Id-Spalte.
Ich hatte dasselbe problem mit dem viele zu viele Beziehung zwischen Film und Genre. Das Programm warf
Hibernate Error: org.hibernate.NonUniqueObjectException: ein anderes Objekt mit der gleichen id-Wert war bereits im Zusammenhang mit der Sitzung
Fehler.
Später fand ich heraus, dass ich nur noch sicherstellen, dass Sie @GenerateValue der GenreId get-Methode.
InformationsquelleAutor der Antwort Thupten
nur überprüfen Sie die id, ob es dauert, null oder 0 wie
hinzufügen oder aktualisieren, in denen die Inhalte gesetzt sind, aus der form zu Pojo
InformationsquelleAutor der Antwort Ayan Sarkar
Ich traf dieses problem mit dem löschen eines Objekts, weder entfernen noch deaktivieren geholfen.
InformationsquelleAutor der Antwort TimP
Ich hatte ein ähnliches problem. In meinem Fall hatte ich vergessen zu setzen, die
increment_by
Wert in der Datenbank werden die gleichen wie die von dercache_size
undallocationSize
. (Die Pfeile zeigen auf die genannten Attribute)SQL:
Java:
InformationsquelleAutor der Antwort kaba713
Ich habe den gleichen Fehler, ich war zu ersetzen und meine Sammlung mit einer neuen zu Holen von Jackson.
Um dieses Problem zu lösen ich halte das bestehende set, Entferne ich aus der alten das element unbekannten in die neue Liste mit
retainAll
.Dann füge ich die neue mit
addAll
.Keine Notwendigkeit, um die Sitzung und manipulieren.
InformationsquelleAutor der Antwort Ôrel
Versuchen. Die unten arbeitete für mich!
In der
hbm.xml
DateiMüssen wir um die
dynamic-update
Attribut der Klasse tag zutrue
:Legen Sie die class-Attribut des generator-tag unter einzigartigen Spalte
identity
:Hinweis: stellen Sie die eindeutige Spalte zu
identity
eher alsassigned
.InformationsquelleAutor der Antwort Explorer_N
Andere Sache, die für mich gearbeitet wurde, um die Instanz-variable Lang statt lange
Ich hatte meine primary key-variable (long id;
ändern Sie es zu Long id; arbeitete
Alle die besten
InformationsquelleAutor der Antwort
Kann man immer tun, eine Sitzung flush.
Der Flush synchronisieren Sie den Zustand aller Ihrer Objekte in session (bitte jemand korrigieren Sie mich, wenn ich falsch Liege), und vielleicht würden Sie es lösen Ihr problem in einigen Fällen.
Umsetzung Ihrer eigenen equals und hashcode kann Ihnen helfen, zu.
InformationsquelleAutor der Antwort caarlos0
Können Sie Ihre Cascade-Einstellungen. Die Cascade-Einstellungen auf Ihre Modelle könnte die Ursache sein. Ich entfernte Cascade-Einstellungen (im Wesentlichen nicht erlaubt Cascade Inserts/Updates) und das ist mein problem gelöst
InformationsquelleAutor der Antwort user1609848
Fand ich diese Fehler auch. Was für mich gearbeitet ist, um sicherzustellen, dass der primäre Schlüssel (wird automatisch generiert) ist nicht eine PDT (D. H. long, int, ect.), sondern ein Objekt (also Long, Integer, etc).
Wenn Sie das Objekt erstellt haben, um es zu speichern, stellen Sie sicher, dass Sie übergeben Sie null und nicht 0 ist.
InformationsquelleAutor der Antwort Jaco Van Niekerk
Ich bin neu in NHibernate, und mein problem war, dass ich eine andere session Abfragen mein Objekt, als ich Tat, um es zu speichern. Also das speichern von session-didn ' T wissen über das Objekt.
Es scheint offensichtlich, aber aus der Lektüre der bisherigen Antworten, die ich suchte überall für 2 Objekte, nicht 2 Sitzungen.
InformationsquelleAutor der Antwort DustinA
Funktioniert diese Hilfe?
InformationsquelleAutor der Antwort George Papatheodorou
@GeneratedValue(strategy=GenerationType.IDENTITÄT), das hinzufügen dieser Annotationen zu den Primärschlüssel-Eigenschaft in Ihrer entity-bean sollte das Problem lösen.
InformationsquelleAutor der Antwort Jay
Ich dieses problem gelöst .
Eigentlich ist dies passiert, weil wir vergessen haben, die Umsetzung der Generator-Typ PK-Eigenschaft in der bean-Klasse. So machen es jeder Art wie
wenn wir bestehen Fort, die Objekte der bean ,jedes Objekt erworben, gleiche ID ,so erste-Objekt gespeichert wird ,wenn ein anderes Objekt zu werden, bestehen dann HIB FW durch diese Art der
Exception: org.hibernate.NonUniqueObjectException:
ein anderes Objekt mit der gleichen id-Wert war bereits im Zusammenhang mit der Sitzung.InformationsquelleAutor der Antwort Ankit Sharma
Ich entschieden habe ein ähnliches problem wie hier:
InformationsquelleAutor der Antwort user3132194
bevor die position, wo sich wiederholenden Objekten beginnen , sollten Sie die Sitzung schließen
und dann sollten Sie eine neue Sitzung starten
so, in dieser Art und Weise in einer Sitzung, es ist nicht mehr als eine Personen, die den gleichen Bezeichner.
InformationsquelleAutor der Antwort engtuncay
Das problem tritt auf, weil im gleichen hibernate-session die Sie zu speichern versuchen, zwei Objekte mit derselben Kennung.Es gibt zwei Lösungen:-
Dies ist passiert, weil Sie nicht so konfiguriert haben, Ihre mapping.xml richtig Datei für die id-Felder wie folgt:-
Überladung der Methode getsession zu akzeptieren einen Parameter wie isSessionClear,
und klar, die Sitzung vor der Rückkehr der aktuellen Sitzung wie unten
Dadurch wird die bestehende session-Objekte gelöscht werden, und auch wenn hibernate nicht erzeugen einer eindeutigen Kennung ,vorausgesetzt, Sie haben konfiguriert Ihre Datenbank ordnungsgemäß für eine primary key mit Auto_Increment,sollte es für Sie funktionieren.
InformationsquelleAutor der Antwort Rahul Kumar
Ist eine Problemumgehung um dieses Problem zu lösen, ist zu versuchen, zu Lesen, das Objekt wieder aus dem Ruhezustand cache/db, bevor Sie irgendwelche updates und dann beibehalten.
Beispiel:
Hinweis: beachten Sie, dass damit nicht beheben Sie die Ursache, aber behebt das Problem.
InformationsquelleAutor der Antwort Nuwan
Anders als das, was wbdarby sagte, es kann sogar passieren, wenn ein Objekt geholt wird, indem die Bezeichner des Objekts an einer HQL. Im Fall von versuchen, ändern Sie die Objekt-Felder und speichern Sie es wieder in die DB(Modifikation sein könnte, insert, delete oder update) über die gleiche Sitzung, wird dieser Fehler angezeigt. Versuchen Sie, löschen der hibernate-session vor dem speichern des modifizierten Objekt oder erstellen Sie eine komplett neue session.
Hoffe, dass ich geholfen 😉
InformationsquelleAutor der Antwort Arash moradabadi
Spät zur party, aber kann helfen, für die kommenden Nutzer -
Ich habe dieses Problem, wenn ich wählen Sie einen Datensatz mit
getsession()
wieder update ein anderer Datensatz mit derselben identifier mit gleichen Sitzung das Problem verursacht. Hinzugefügt code unten.Dies sollte nie getan werden . Lösung ist entweder vertreiben-Sitzung, bevor Sie aktualisieren oder ändern von business-Logik.
InformationsquelleAutor der Antwort vipin cp
Können Sie
session.merge(obj)
, wenn Sie das tun, speichern Sie mit unterschiedlichen sessions mit demselben identifier persistente Objekt.Es hat funktioniert, ich hatte dasselbe Problem vor.
InformationsquelleAutor der Antwort Pavan Kumar