Postaw na metodę
@Transactional
poradziłbym lepiej, ale musiałbym sprawdzić api, błąd leży w tym że nie wiesz czym jest CYKL ŻYCIA DLA encjI - > i co się dzieje w metodach których używasz... dlatego uważam, żę klepanie "CRUD" z springiem nie uczy niczego, dla tych co zaczynają, bo gwarantuje że nie przeczytałeś dokumentacji HIBERNATE i tym co robią metody
saveAll deleteAll etc.
mam na myśli, że nie przestudiowałeś jak się zachowują tak naprawdę :) co się dzieje przy wywołaniu ich co robi HIBERNATE dla twojej encji, to nie tylko byle jakie operacje "usun" " zapisz" po to są metadane żeby czytać co się dzieje przy okazji całej kaskady .
spróbuj po dodaniu @Transacional dodać operacje batchową
void deleteAllInBatch(Iterable<T> entities)
Nie wiem jakiego entitymenadzera używasz - jaka to konfiguracja niestety bo bez kodu nei pomogę
dlatego jeszcze MOŻESZ po wykonaniu operacji usuwania zrobić flush()
Dlaczego się tak dzieje? Działasz na oderwanej ENCJI- > więc operacja delete działa tylko aplikacja działa tak że jak robisz na oderwanej encji DELTE to potem na tej oderwanej encji robisz save... ? Więc ostatecznie usuwasz i tyle.
Musisz po delte przywrócić LOCK na bazie -> żeby móc zapisać nową encje
(alternatywa to robienie flush -> po operacji... ale generalnie po usunięciu nad metodą możesz dodać, lub na całej metodzie która to robi )
@Modifying(flushAutomatically = true)
Hibernate zmienił kolejność poleceń. Działa w poniższej kolejności: Wykonaj wszystkie aktualizacje SQL i pamięci podręcznej drugiego poziomu, w specjalnej kolejności, aby nie można było naruszyć ograniczeń klucza obcego:
1. Wstaw w kolejności wykonania
2. Aktualizuj
3. Usuwanie elementów kolekcji
4. Wstawianie elementów kolekcji
5. Usunięcia, w kolejności ich wykonania
!Ważna uwaga :) jeśli massz powiązanie encji i robisz save() z CASCADE_ALL -> to użyj zamiast save() -> persist()