Używam Spring with Hibernate. Używam testów JUnit tak:OptimisticLockException w pesymistycznym blokowaniu
String number = invoiceNumberService.nextInvoiceNumber();
i sposób invoiceNumberService jest:
InvoiceNumber invoiceNumber = invoiceNumberRepository.findOne(1L);
to przy użyciu prostej metody repozytorium danych wiosna, i to działa dobrze. Ale kiedy zastąpić tę metodę do korzystania blokowania:
@Lock(LockModeType.PESSIMISTIC_READ)
@Override
InvoiceNumber findOne(Long id);
Dostaję „javax.persistence.OptimisticLockException: Wiersz został zaktualizowany lub usunięty przez inną transakcję”
Nie mogę zrozumieć, dlaczego jego optymistyczne wyjątek blokady , podczas gdy używam pesymistycznego blokowania? A gdzie jest ta część, gdy inna transakcja zmienia ten podmiot? Mam już kopać wiele podobnych pytań i jestem bardzo zdesperowany na ten temat. Dzięki za wszelką pomoc
Rozwiązanie:
Problem był w mojej funkcji init w klasie testu:
@Before
public void init() {
InvoiceNumber invoiceNumber = new InvoiceNumber(1);
em.persist(invoiceNumber);
em.flush();
}
Było brak
em.flush();
które zapisuje dane do bazy danych , więc findOne() może teraz odzyskać to
Wpadłem na ten sam problem i to samo rozwiązanie. Brzmi jak błąd dla mnie, że Hibernate sam się nie spłukuje. – gnomie