Primavera de arranque da APP update para atualizar somente os campos específicos

0

Pergunta

Então eu encontrei este problema com a atualização de uma entidade no banco de dados. ao Passar um todo entidade e atualizar somente os campos específicos de que trata intocada campos como nulo, como resultado recebo uma exceção, já que os campos são @Not-Null,

Eu tentei olhar para problemas semelhantes, mas não poderia corrigir o meu problema.

Empresa de ENTIDADE:

@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<>();
}

A maioria dos campos são @NotNull para a criação, no entanto, eu preciso atualizar a entidade, por vezes, apenas os campos específicos.

Serviço:

@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";
}

como você pode ver um ENTITY foi passado que faz com que o resto de atributos para ser automaticamente nulo se não for modificado.

Controlador:

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

EXCEÇÃO:

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}'}
]

Obrigado.

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

Melhor resposta

0

O controlador é a ligação a valores você passa para uma nova entidade da Empresa. A nova entidade não está ligado ao contexto persistente, ele não tem o estado de pré-existente entidade. Quando você salvá-lo JPA considera que você deseja nulos todos os campos que não têm valores.

Em vez disso, você poderia ter o controlador de vincular seus argumentos para um DTO. Em seguida, o serviço que você procure o Cliente já existente, usando o método read, e copie os campos que você deseja atualizado do DTO para a entidade. Em seguida, chamar saveAndFlush passando a entidade atualizada.

Parece que há uma melhoria sobre o DTO, você pode usar aJsonPatch para manter as atualizações passado, consulte https://www.baeldung.com/spring-rest-json-patch. O patch método parece ser uma melhor correspondência para o que você está fazendo de qualquer maneira.

No servidor, o importante é procurar a entidade existente para que você tenha uma entidade que é ligada ao contexto persistente e tem todos os seus campos atuais.

2021-11-21 20:00:13

Em outros idiomas

Esta página está em outros idiomas

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