Ich verwende Spring mit Hibernate. Ich bin mit JUnit-Test wie folgt aus:OptimisticLockException in pessimistischen Sperren
String number = invoiceNumberService.nextInvoiceNumber();
und invoiceNumberService Methode ist:
InvoiceNumber invoiceNumber = invoiceNumberRepository.findOne(1L);
es einfache Feder-Daten-Repository-Methode verwendet, und es funktioniert gut. Aber wenn ich diese Methode überschreiben Verriegelung zu verwenden:
@Lock(LockModeType.PESSIMISTIC_READ)
@Override
InvoiceNumber findOne(Long id);
Ich erhalte „javax.persistence.OptimisticLockException: Row aktualisiert wurde oder durch eine andere Transaktion gelöscht“
Ich kann nicht verstehen, warum seine optimistische Sperre Ausnahme , während ich pessimistische Verriegelung verwende? Und wo ist dieser Teil, wenn eine andere Transaktion diese Entität ändert? Ich habe schon viele ähnliche Fragen und ich bin ziemlich verzweifelt darüber. Vielen Dank für jede Hilfe
Lösung:
Das Problem war in meiner Funktion init in Testklasse:
@Before
public void init() {
InvoiceNumber invoiceNumber = new InvoiceNumber(1);
em.persist(invoiceNumber);
em.flush();
}
Es war der Mangel an
em.flush();
, die die Daten in der Datenbank speichert , so dass findOne() es jetzt retreive
Ich stieß auf das gleiche Problem und die gleiche Lösung. Klingt für mich wie ein Fehler, dass Hibernate nicht selbst flutet. – gnomie