• 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.

Object Storage Arubacloud
+1 głos
292 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 (270,170 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 (270,170 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 (270,170 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ź 175 wizyt
0 głosów
1 odpowiedź 218 wizyt
0 głosów
1 odpowiedź 290 wizyt
pytanie zadane 14 października 2019 w Java przez JuniorPL Użytkownik (770 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...