• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Hibernate - nie mogę wykonać operacji save po delete.

Aruba Cloud - Virtual Private Server VPS
+1 głos
392 wizyt
pytanie zadane 5 stycznia 2022 w Java przez marzena12345 Użytkownik (770 p.)

Cześć, potrzebuję wykonać operację delete, aby usunąć wszystkie wpisy o danym lineId, następnie chcę zapisać nowe encje o tym samym lineId. Dlaczego nie robię update? Moje operacje są związane ze zmianą kalibracji wykresu przez użytkownika - po jego zmianie otrzymuje całkiem nowe encje i ich ilość może ulec zmianie. 

Bez delete wszystko się zapisuje, ale z delete tylko usuwa i na tym kończy, nic się nie zapisuje.

 

public void deleteAndSaveEntities(List<Entity> entities, Long lineId){
    deleteEntities(lineId);
    saveEntities(entities);
}

private void deleteEntities(Long lineId) {
    List<Entity> entitiesToDelete = entityRepository.findAllByLineId(lineId);
    entityRepository.deleteAll(entitiesToDelete); 
}

private void saveEntities(List<Entity> entities) {
    entityRepository.saveAll(entities);
}

 

komentarz 6 stycznia 2022 przez Wiciorny Ekspert (280,450 p.)
wiem, że zapytałeś na stacku też https://stackoverflow.com/questions/70592692/cannot-save-after-deleting-entity-in-hibernate/70593325
i tam podobnie - odpowiedział ktoś, generalnie problem jest w tym że póki hibernate nie skonczy transakcji twój save wykonał się przed deletem bo nie aktualizujesz stanu bazy po wykonaniu operacji tylko pozwalasz na kontrole przez mechanizm hibernat'a

2 odpowiedzi

+1 głos
odpowiedź 5 stycznia 2022 przez Wiciorny Ekspert (280,450 p.)
edycja 5 stycznia 2022 przez Wiciorny

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()

0 głosów
odpowiedź 5 stycznia 2022 przez Dev Ox29A Dyskutant (8,400 p.)
Zrób test w samej bazie danych - zapisz ręcznie wcześniej skasowaną krotkę , z tym samym id. bo coś mi się wydaje że masz autogenerate ...
komentarz 5 stycznia 2022 przez Wiciorny Ekspert (280,450 p.)
nie, to nie kwestia autogenerate tylko zrozumienia hibernate... kolega "używa" jak 85% osób przy pracy z Hibernate i Springiem adnotacji, frameworka -> klepiąc crud a nie rozumie co się kryję pod bebechami.
Tutaj chodzi o oderwanie encji - i transakcji ... stan bazy jest zatrzymywany przy jednej operacji na obiekcie z tej bazy

Podobne pytania

0 głosów
1 odpowiedź 313 wizyt
0 głosów
1 odpowiedź 278 wizyt
0 głosów
1 odpowiedź 404 wizyt
pytanie zadane 14 października 2019 w Java przez JuniorPL Użytkownik (770 p.)

93,324 zapytań

142,323 odpowiedzi

322,390 komentarzy

62,653 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...