Frage

Ich verwende Spring für DI und Hibernate für den Datenzugriff auf eine MySQL-Datenbank.Ich habe Code in einer Transaktion, die einen Datensatz in eine Tabelle einfügt und dann eine Ansicht ausführt, die diese Tabelle abfragt und einige Aggregatberechnungen durchführt.Das Problem, das ich sehe, ist, dass der Datensatz, den ich gerade während derselben Transaktion eingefügt habe, nicht in den berechneten Werten der Ansicht enthalten ist.Ich führe dieselbe Ansicht in MySQL Workbench aus und der eingefügte Wert ist in der Ansicht enthalten.Weiß jemand, was das verursacht?

War es hilfreich?

Lösung

letztendlich musste ich entitymanager.refresh (Objektentität) anrufen, um die Entität für den Ansichts-Datensatz aufzufrischen, den ich auf dem Ruf aktualisiert habe.Ich denke, dass das Problem in der Tatsache besteht, dass Hibernate nicht erkennen kann, dass die Ansicht aktualisiert werden muss, da sie nicht weiß, dass sie abhängig ist (auf Datenbankebene) auf der aktualisierten Originaleinheit, die aktualisiert wurde.Ich nehme an, dass Hibernate die Aufzeichnungen aus der Ansicht speichert und nicht weiß, dass sie auch nach einem Flush () aktualisiert werden müssen.

hibernate sieht den ursprünglichen Tisch und die Ansicht als vollständig nicht zusammenhängend, wenn in der Realität die Ansicht von der Tabelle abhängig ist, und sollte, wenn sich die Tabelle ändert.Ich weiß nicht, wie ich den Winterschlaf bekommt, um das zu erkennen.

Andere Tipps

Höchstwahrscheinlich haben Sie noch keine Änderungen in der Datenbank gespült.Hibernate weiß nicht, dass es eine Verbindung zwischen Tabelle gibt, die Sie mit Reihen eingefügt haben, und Ansicht, dass Sie später lesen.Flush EntityManager (oder Session oder Template) vor der Abfrageansicht.

Dies wird höchstwahrscheinlich durch die Standardisolationsstufe von MySQL verursacht, die lautet REPEATABLE READ.

Dies bedeutet, dass Ihre Transaktion in MySQL Workbench erst dann Änderungen sieht, wenn Sie Ende diese Transaktion.Das Ausführen einer AUSWAHL zählt als Transaktion.

Sie sollten die Änderungen in MySQL Workbench sehen, sobald Sie dort ein Commit (oder Rollback) ausgeben.

Sie möchten wahrscheinlich entweder die Standardisolationsstufe für Ihre Installation auf ändern READ COMMITTED oder ändern Sie die Isolationsstufe Ihrer Sitzung in MySQL Workbench in READ COMMITTED

Details dazu, wie Sie das tun, finden Sie im Handbuch.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top