hibernate insert batch mit partitionierten postgresql
gibt es eine Lösung für die batch einfügen über hibernate in partitionierten postgresql-Tabelle? derzeit bin ich bekommen eine Fehlermeldung wie diese...
ERROR org.hibernate.jdbc.AbstractBatcher - Exception executing batch:
org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
at org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.java:61)
at org.hibernate.jdbc.Expectations$BasicExpectation.verifyOutcome(Expectations.java:46)
at org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.java:68)....
habe ich diesen link gefunden, http://lists.jboss.org/pipermail/hibernate-dev/2007-October/002771.html aber ich kann nicht finden Sie überall im web, ist dieses problem gelöst, oder wie kann es sein, umgehen
- Andere Lösungen für Hibernate 3.5 ?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Möchten Sie vielleicht versuchen, eine benutzerdefinierte Batcher durch die Einstellung der hibernate.jdbc.factory_class Eigenschaft. Sicherstellen, dass hibernate nicht die update-zählen der batch-Operationen und lösen Sie Ihr problem, Sie kann das erreichen, indem Sie Ihre benutzerdefinierten Batcher erweitern Sie die Klasse BatchingBatcher, und dann das überschreiben der Methode doExecuteBatch(...) so Aussehen:
Beachten Sie, dass die neue Methode nicht überprüfen Sie die Ergebnisse der Ausführung der Anweisungen vorbereitet. Denken Sie daran, dass diese änderung möglicherweise Auswirkungen auf hibernate in einigen unerwartete Weise (oder vielleicht auch nicht).
Sagen Sie zwei Trigger in einer partitionierten Tabelle oder die @SQLInsert-Anmerkung hier: http://www.redhat.com/f/pdf/jbw/jmlodgenski_940_scaling_hibernate.pdf Seiten 21-26 (es erwähnt auch eine @SQLInsert Angabe eines String-Methode).
Hier ist ein Beispiel mit einem after-trigger zu löschen, die extra Zeile in der master: https://gist.github.com/copiousfreetime/59067
Angezeigt, wenn Sie mithilfe von REGELN können instead of-Trigger für einfügen, dann zurück auf die richtige Zahl, aber nur mit einer einzigen REGEL ohne eine WHERE-Anweisung.
ref1
ref2
ref3
eine weitere option könnte sein, eine Ansicht zu erstellen, die 'Wickel' die partitionierte Tabelle, dann kehren Sie die NEUE Zeile aus, um anzugeben, eine erfolgreiche Reihe zu aktualisieren, ohne versehentlich hinzufügen, eine zusätzliche, unerwünschte Zeile der master-Tabelle.
ref: http://www.postgresql.org/docs/9.2/static/trigger-definition.html
Wenn Sie ging der Blick wrapper-route eine option ist auch bagatell - "statt" - Trigger für delete-und update -, sowie, dann können Sie einfach den Namen der view-Tabelle anstelle Ihres normalen Tabelle, in der alle Transaktionen.
Anderen option verwendet, wird die Ansicht zum erstellen einer insert-Regel so, dass alle Einsätze auf die Haupt-Tabelle gehen Sie auf die Ansicht [welche verwendet Ihr Auslöser], ex (vorausgesetzt, Sie haben bereits
partitioned_insert_trigger
und tablename_view und insert_view_trigger erstellt wie oben aufgeführt)Dann wird es mit Ihren neuen Arbeits-view-wrapper einfügen.
thnx! es war der trick, keine Probleme bis poped, so weit :)....eine Sache, die du...
ich hatte zu implementieren
BatcherFactory
Klasse und legte es int diepersistence.xml
- Dateiwie diese:
aus, dass die Fabrik, die ich genannt habe, meine batcher Umsetzung mit dem code oben
ps
hibernate core 3.2.6 GA
Dank noch einmal
Ich Stand vor dem gleichen problem beim einfügen von Dokumenten durch Ruhezustand nach viel suchen herausgefunden, dass es erwartet wird, dass die aktualisierten Zeilen, die zurückgegeben werden sollen, also statt der null ändern, um neue trigger-Verfahren, das wird das problem beheben, wie unten gezeigt
RETURN NEW
Fand ich eine andere Lösung für das gleiche problem auf dieser Webseite:
Dies legt nahe, dieselbe Lösung, die @rogerdpack sagte, die änderung der Null Zurück zu Return NEW, und das hinzufügen eines neuen trigger, der löscht die doppelten Tupel in der master mit der Abfrage: