Hibernate Delete Error: Stapelaktualisierung Zurückgegebene unerwartete Zeilenanzahl
Schrieb ich diese Methode, die wohl zum löschen eines Mitglied-Datensatz aus der Datenbank. Aber wenn ich es in meinem servlet gibt es einen Fehler.
MemberDao Klasse
public static void deleteMember(Member member) {
Session hibernateSession = HibernateUtil.getSessionFactory().getCurrentSession();
Transaction tx = hibernateSession.beginTransaction();
hibernateSession.delete(member);
tx.commit();
}
Controller-Teil
if(delete != null) {
HttpSession httpSession = request.getSession();
Member member = (Member) httpSession.getAttribute("member");
MemberDao.deleteMember(member);
nextPage = "ledenlijst.jsp";
}
HTTP-Status 500
org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
Manchmal ist es sogar wirft diese Fehlermeldung, wenn ich versuche, führen Sie die Seite mehrmals.
org.hibernate.exception.GenericJDBCException: Could not execute JDBC batch update
Weiß jemand, was genau verursacht diesen Fehler?
InformationsquelleAutor der Frage Kid Diamond | 2014-01-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Fehler können durch Folgendes verursacht werden. Ich bin nicht dabei, den Kredit für es, fand es hier.
Schauen auch diese Antwort von beny23 gibt ein paar weitere Tipps, um das problem zu finden.
InformationsquelleAutor der Antwort Ashish Jagtap
In meinem Fall diese Ausnahme wurde verursacht durch falsche entity mapping. Es gab keine Kaskade für die Beziehung, und auf die untergeordnete Entität nicht gespeichert, bevor Sie versuchen, zu verweisen, es von den Eltern. Ändern Sie es zu
wurde das Problem behoben.
Sicherlich beste Weg, um zu finden, die Ursache für diese Ausnahme ist die Einstellung show_sql und DEBUG-level für die Protokolle - es wird halt nur noch an der sql, die das problem verursacht.
InformationsquelleAutor der Antwort mdziob
Ich Stand vor dem gleichen Problem.
Der code war in der Testumgebung. Aber es war nicht in der staging-Umgebung.
Das problem war die Tabelle hatte einzelnen Eintrag für jeden Primärschlüssel in Tests DB-Tabelle. Aber die Inszenierung von DB gab es mehrere Einträge für den gleichen Primärschlüssel. ( Problem ist im staging-DB-die Tabelle hat keine primary key-Einschränkungen auch gab es mehrere Eintrag).
Also jedes mal nach dem update-Vorgang es wird fehlgeschlagen. Es versucht, zu aktualisieren einzelner Datensatz und erwarten, dass get update-Zählung als 1. Aber da gab es 3 Einträge in der Tabelle für den gleichen Primärschlüssel haben, ist Das Ergebnis-update Zählung findet 3. Da erwartete update zählen und Ergebnis aktualisieren der Zählung nicht übereinstimmen, wirft Ausnahme, und rollt sich zurück.
Nach dem ich Sie entfernt alle Einträge, die doppelten primary key und primary key-Einschränkungen Hinzugefügt. Es ist in Ordnung.
InformationsquelleAutor der Antwort ParagFlume
dies ist die Lösung für meinen Fall, vielleicht hilft es dir!
Eigentlich war es ein Konvertierungs-problem zwischen einem Datenbank-Feld-Typ (timestamp bei postgreSQL) und seine entsprechende Eigenschaft Typ (Kalender) auf der hibernate-xml-Datei.
Wenn Hibernate hat diese update-Anfrage, es habe keine abrufen der Zeile, weil die Anfrage zu befragen, mit einem schlechten konvertieren Kalender Wert.
Also habe ich Sie einfach ersetzt, Eigentum Typ "Kalender" in "Datum" im Hibernate-xml-Datei und das problem war behoben.
InformationsquelleAutor der Antwort Julien
ich vor kurzem erlebt und was geschah, war, dass ich die update-Methode, und es war eine Ausnahme, weil es keine bestehende Aufzeichnung. Ich habe die Methode saveOrUpdate. Es arbeitete.
InformationsquelleAutor der Antwort arn-arn
Habe ich das gleiche Problem mit hibernate/JPA 2.1 bei der Verwendung von memcached als sekundärer cache. Würde man der oben genannten Ausnahme sowie eine StaleStateException. Die Auflösung war anders als das, was wurde zuvor notiert haben.
Bemerkte ich, dass, wenn Sie eine operation, die verschachtelt löscht und wählt (sucht) von innerhalb der gleichen Tabelle und transaction, hibernate, können sich überwältigt und berichten, dass veraltete Zustand Ausnahme. Es würde nur auftreten, ist für uns während der Produktion, da mehrere identische Operationen auf verschiedenen Entitäten auftreten würde, auf die gleiche Tabelle. Sehen Sie die system-timeout und werfen von Ausnahmen.
Die Lösung ist einfach effizienter. Statt interleaving in einer Schleife versucht zu lösen, die Elemente, die gelesen werden müssen und so zu tun, vorzugsweise in einem Betrieb. Dann führen Sie das löschen in einem separaten Vorgang. Wieder, alle in der gleichen Transaktion, aber nicht Pfeffer hibernate mit Lesen/löschen/Lesen/löschen-Operationen.
Dies ist viel schneller und reduziert die Zimmerreinigung laden, auf Ruhezustand erheblich. Das problem ging Weg. Dies tritt auf, wenn Sie mit einem Sekundär-cache und sonst nicht vorkommen, da wird die Last auf die Datenbank für die Auflösung ohne secondary cache. Das ist ein anderes Thema.
InformationsquelleAutor der Antwort sagneta
Ich habe dieses problem,
Ich habe meine code, gab es keine Probleme, aber wenn ich überprüfte meine Daten, die ich gefunden habe, hatte ich zwei Einheiten mit der gleichen id!
So, die
flush()
konnte nicht funktionieren, denn Sie arbeitet nacheinander für batch-updates und es sind 2 Zeilen. Daher ist es nicht update und warf Ausnahme, aber es war mein problem. Ich weiß nicht, ob es funktioniert gut für Sie ist oder nicht!InformationsquelleAutor der Antwort Marzieh Ghadirinia
Ausnahme
org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
verwenden Sie geworfen werden, wenn Hibernate beachten Sie, dass die Person will er bündig mit der Datenbank ist nicht genau so, wie es war zu Beginn der Transaktion.
Habe ich beschrieben, mehr in details zwei unterschiedliche Anwendungsfälle, die mir passieren hier.
InformationsquelleAutor der Antwort Sergio Lema