Ich benutze Spring mit Hibernate. Ich führe jUnit Test wie folgt aus:
%Vor%und invoiceNumberService-Methode ist:
%Vor%Es verwendet eine einfache Federdaten-Repository-Methode, und es funktioniert gut. Aber wenn ich diese Methode überschreiben, um Sperren zu verwenden:
%Vor%Ich bekomme "javax.persistence.OptimisticLockException: Zeile wurde von einer anderen Transaktion aktualisiert oder gelöscht"
Ich kann nicht verstehen, warum seine Ausnahme für optimistische Sperren, während ich pessimistisches Sperren verwende? Und wo ist dieser Teil, wenn eine andere Transaktion diese Entität ändert?
Ich habe schon viele ähnliche Fragen gegraben und ich bin ziemlich verzweifelt darüber. Danke für jede Hilfe
Lösung:
Das Problem war in meiner init-Funktion in der Testklasse:
Es gab einen Mangel an
%Vor%Was speichert die Daten in der Datenbank, so dass findOne () kann es jetzt retrieve
Frage: Haben Sie die @transcational Annotation in dao oder service layer angegeben? Es passiert aus dem Grund, dass zwei Transaktionen gleichzeitig versuchen, die Daten der gleichen Tabelle zu ändern. Wenn Sie also alle Annotationen von der Dao-Ebene entfernen und in die Service-Ebene einfügen, sollte das Problem gelöst werden, da ich konfrontiert war ähnliche Art von Problem. Ich hoffe es hilft.
Nur um es zu tun, werde ich das Folgende veröffentlichen, wenn jemand nicht einverstanden ist, bitte korrigieren Sie mich. Im Allgemeinen wird in Java empfohlen, Spring / Hibernate und JPA zu verwenden. Hibernate implementiert JPA, sodass Sie Abhängigkeiten für Spring und Hibernate benötigen.
Als nächstes lassen Spring / Hibernate Ihre Transaktionen und den Commit-Teil verwalten. Es ist eine schlechte Übung, Ihre Daten selbst zu spülen / zu übertragen.
Nehmen wir zum Beispiel die folgende Methode an:
%Vor%Nach dieser Methode wird nichts passieren (Sie könnten Merge und Commit aufrufen). Wenn Sie es jedoch mit @Transactional annotieren, wird Ihre Entität verwaltet und am Ende der @ Transactional-Methode werden Spring / Hibernate Ihre Änderungen festschreiben. Das ist genug:
%Vor%Sie brauchen keine Spülung, Spring / Hibernate kümmert sich um alles. Vergessen Sie nicht, dass Ihre Tests @Transactional-Methoden aufrufen müssen oder selbst @Transactional sein sollten.