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?
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.
@Mateusz Marczak
Jak używasz Spring Data JPA robisz na 2 sposoby:
- 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
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 null
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.
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.
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?
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.
@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
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 :)