Pytanie: jak poprawnie zaimplementować metodę aktualizującą encję?
Najprostszy sposób:
Sprawdzić czy w userDto dane pole nie jest nullem (i generalnie czy się poprawnie waliduje) i jeśli tak to na obiekcie user ustawić tę wartość na polu a finalnie wywołać update na repozytorium (w kontrolerze naturalnie http method patch).
Tyle, że ifowanie każdego pola z dto czy jest ok itp wydaje mi się słabe i się nie skaluje.
I zapewne istnieje
Mam w aplikacji encje User która zawiera pole typu Address(które zawiera sobie elementy specyficzne dla adresu jak miasto, ulicę itp). Wszystko to okraszone relacją @OneToOne:
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
private Address address;
Mam w kontrolerze metodę do aktualizacji encji User która:
- pobiera encję za pomocą jpa repository
- aktualizuje poszczególne pola (w zależności co przyjdzie w DTO)
- zapisuje z powrotem do bazy metodą save
@Entity(name = "addresses")
public class Address {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
Tak samo w User.
Faktycznie gubi ID adresu.
public static String[] getNullPropertyNames (Object source) {
final BeanWrapper src = new BeanWrapperImpl(source);
java.beans.PropertyDescriptor[] pds = src.getPropertyDescriptors();
Set emptyNames = new HashSet();
for(java.beans.PropertyDescriptor pd : pds) {
Object srcValue = src.getPropertyValue(pd.getName());
if (srcValue == null) emptyNames.add(pd.getName());
}
String[] result = new String[emptyNames.size()];
return emptyNames.toArray(result);
}
Update:
Naturalnie doczytam o Dirty checking :)