Spring Boot update crud

0

Cześć,
mam restowe api w spring boot. Przez postmana metoda PUT, przekazuje jsona zawierającego tylko jedno pole z klasy oraz id. Do zapisania w bd używam CrudRepository save().
W takim przypadku niestety pozostałe pola z klasy zapisuje mi nullami. Czy jest jakieś szybkie rozwiązanie aby updatować tylko to jedno pole?

0

Używając metody save() zapisujesz nowy obiekt do bazy. Musisz go najpierw pobrać (np. po id - który posiadasz) a następnie nadpisać tylko te pola które chcesz i dopiero zapisać ten obiekt z nowymi wartościami.

0

@Mateusz Marczak
Jak używasz Spring Data JPA robisz na 2 sposoby:

  1. przez operacje na encji
    a)W transkacji(adnotacja Transactional albo TransactionTemplate) pobierasz encje np. przez findById
    b)aktualizujesz wybrane pola w pobranej encji
    c)po transakcji Ci zaktualizuje (dirty checking)
    2)Stosujesz zapytania JPQL do aktualizacji:
    https://www.baeldung.com/spring-data-jpa-query

Metoda save przy aktualizacji nie jest potrzebna

0

dzięki za odpowiedzi ale w sumie to dalej nie to. Zgodnie z dokumentacją meta z CRUDRepository zachowuje się jak saveOrUpdate z hibernata, czyli jak przesyłam obiekt bez id to tworzy nowy a jak przesyłam z id to go aktualizuje. To mam ogarnięte. Problem leży w tym (chyba :) ), że jak przesyłam jsona z pominięciem jakiegoś pola z klasy, to z automatu wstawia się tam nullscreenshot-20191121081629.png

pobierając encje, musiałbym wiedzieć jakie pola chce aktualizować albo porównać to z przesłanym obiektem.
przy JPQL też bym już musiał wiedzieć jakie pola chce aktualizować a nie wiem jakie dostane.

1
Mateusz Marczak napisał(a):

Problem leży w tym (chyba :) ), że jak przesyłam jsona z pominięciem jakiegoś pola z klasy, to z automatu wstawia się tam null!

Wydaje mi się że tutaj możesz mieć racje.

3

Jak będziesz pchał surowe encje REST-em to będziesz miał takie problemy. Jeśli nie ma jakiegoś pola w requescie, to jaka tam ma być wartość, jeśli nie 0 lub null?

0

Liczyłem na to, że przy updacie będzie to działało raczej na setowaniu poszczególnych wartości, a to co nie jest przekazane jest pomijane.

0

@Mateusz Marczak: jak stosujesz JPA to powinineneś stosowac również obiekty DTO które nie sa encjami!- do kontrollera musi poleć DTO i w warstwie logiki (chyba że jej nie masz) robisz save/update na bazie danych z dto

1

Nie chcę być złośliwy czy coś, ale poświęciłbym trochę czasu na zrozumienie, co się dokładnie dzieje na poszczególnej warstwie aplikacji (HTTP, Jackson, Spring, JPA, SQL). Dzięki temu będziesz w stanie samodzielnie dojść do rozwiązania :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1