Printemps de démarrage JPA mise à jour pour mettre à jour uniquement des domaines spécifiques

0

La question

J'ai donc rencontré ce problème avec la mise à jour d'une entité en DB. en Passant une entité entière et uniquement la mise à jour des domaines spécifiques, il traite intacte champs null, comme un résultat que j'obtiens une exception puisque ces champs sont @Not-Null,

J'ai essayé de regarder pour des problèmes similaires, mais ne pouvait pas régler mon problème.

ENTITÉ de la société:

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

La plupart des champs sont @NotNull pour la création, cependant, j'ai besoin de mettre à jour l'entité, parfois seulement des domaines spécifiques.

Service:

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

comme vous pouvez le voir un ENTITY a été dépassé ce qui provoque reste des attributs pour être automatiquement null si pas modifié.

Contrôleur:

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

EXCEPTION:

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

Merci.

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

La meilleure réponse

0

Le contrôleur est contraignant les valeurs que vous avez passer à une nouvelle entité de la Société. La nouvelle entité n'est pas attaché au contexte de persistance, il n'a pas l'état de la pré-existante de l'entité. Lorsque vous l'enregistrez JPA pense que vous voulez nulle de tous les champs que vous n'avez pas de valeurs.

Au lieu de cela, vous pourriez avoir le contrôleur de lier ses arguments dans un DTO. Puis dans le service que vous regardez en haut de la Clientèle existante, en utilisant findById, et de copier les champs que vous voulez mettre à jour à partir de la DTO de l'entité. Appelez ensuite saveAndFlush de passage dans la nouvelle entité.

Il semble qu'il y ait une amélioration par rapport à la DTO, vous pouvez utiliser aJsonPatch de tenir les mises à jour adopté, voir https://www.baeldung.com/spring-rest-json-patch. Le patch méthode semble être un meilleur match pour ce que vous faites de toute façon.

Sur le serveur, l'important, c'est de chercher l'entité existante, de sorte que vous avez une entité qui est attaché au contexte de persistance et a tous ses domaines actuels.

2021-11-21 20:00:13

Dans d'autres langues

Cette page est dans d'autres langues

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