Aktualizacja JPA do wiosennej pobierania aktualizacji tylko niektórych pól

0

Pytanie

Dlatego spotkałem się z tym problemem podczas aktualizacji encji do BAZY danych. podczas przesyłania całej istocie i aktualizacji tylko niektórych pól przetwarza dziewicze pole jako puste, w wyniku dostaję wyjątek, tak jak te pola @Not-Null,

Próbowałem znaleźć podobne problemy, ale nie był w stanie rozwiązać swój problem.

OSOBA PRAWNA firmy:

@Entity
@Table (name = "companies")
@Data
@ToString(exclude = "perfumes")
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Company {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;

    @NotNull
    private String name;

    @NotNull
    @Email(message = "Wrong input. please enter a VALID email address")
    private String email;

    @NotNull
    @Size(min = 4, max = 14, message = "Password range must be between 4 - 14 digits")
    private String password;

    @NotNull
    @Enumerated(EnumType.STRING)
    private Country country;

    @Singular
    @OneToMany(mappedBy = "company", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private List<Perfume> perfumes = new ArrayList<>();
}

Większość pól są @NotNull jednak, aby stworzyć muszę zaktualizować istotę, czasami tylko określone pola.

Obsługa:

@Override
public String updateCompany(int id, Company company) throws DoesNotExistException {
    if(!companyRepository.existsById(id))
    {
        throw new DoesNotExistException(id);
    }

    companyRepository.saveAndFlush(company);
    return company.getName() + " has been UPDATED";
}

jak widać, ENTITY przekazano, co prowadzi do tego, że pozostałe atrybuty automatycznie stają się pustymi, jeśli nie są zmienione.

Kontroler:

  @PutMapping("/updateCompany/{id}")
    @ResponseStatus(HttpStatus.ACCEPTED)
    public String updateCompany(@PathVariable int id, @RequestBody Company company) throws DoesNotExistException {
        return admin.updateCompany(id,company);
    }

WYJĄTEK:

Validation failed for classes [com.golden.scent.beans.Company] during update time for groups [javax.validation.groups.Default, ]
List of constraint violations:[
    ConstraintViolationImpl{interpolatedMessage='must not be null', propertyPath=password, rootBeanClass=class com.golden.scent.beans.Company, messageTemplate='{javax.validation.constraints.NotNull.message}'}
]

Dziękuję.

hibernate java jpa
2021-11-21 18:38:43
1

Najlepsza odpowiedź

0

Kontroler wiąże wartości, które przekazuje, do nowej encji Firmy. Nowa jednostka nie jest przywiązany do kontekstu zapisu, nie ma stanu wcześniej istniejącej encji. Gdy zapiszesz go, JPA myśli, że chcesz wyzerować wszystkie pola, do których nie ma wartości.

Zamiast tego można by zapytać kontroler powiązać swoje argumenty do DTO. Następnie w usłudze przeglądania istniejącego klienta, za pomocą findById, kopiowania i pola, które chcesz zaktualizować, z DTO w istotę. Następnie wywołaj saveAndFlush, przekazując aktualne istotę.

Wygląda na to, że jest poprawa w porównaniu z DTO, można użyć aJsonPatch do przechowywania wysłanych aktualizacji, patrz https://www.baeldung.com/spring-rest-json-patch. Metoda poprawki, wygląda na to, lepiej nadaje się do tego, co można jeszcze zrobić.

Na serwerze ważne jest, aby znaleźć istniejący byt, aby istota, połączona z kontekstu zachowania, i wszystkie jej pola były aktualne.

2021-11-21 20:00:13

W innych językach

Ta strona jest w innych językach

Русский
..................................................................................................................
Italiano
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................