J'utilise les données de printemps jpa. J'ai relation un à plusieurs défini comme ceci:JPA remplacer un élément dans une collection
@OneToMany(mappedBy = "participant", cascade = CascadeType.ALL, orphanRemoval = true)
public List<SurveyResponse> getSurveyResponses() {
return surveyResponses;
}
J'ai une méthode qui prend une collection de surveyResponses et remplace repsonses existants qui ont une clé correspondante. Malheureusement, lorsque je l'utilise, Hibernate supprime toutes les réponses autres que celles que j'ajoute. Pourquoi cela se passe-t-il?
Je ne sauvegarde jamais les réponses directement, je les mets juste dans la collection et laisse cascade faire le reste. Voici la méthode qui fait le remplacement:
public void updateResponses(List<SurveyResponse> responses) {
for (SurveyResponse response : responses) {
response.setParticipant(this);
}
if (this.surveyResponses != null) {
Set<String> questionKeys = responses.stream()
.map(SurveyResponse::getQuestionKey)
.collect(Collectors.toSet());
this.surveyResponses.removeIf(
surveyResponse -> questionKeys.contains(surveyResponse.getQuestionKey()));
this.surveyResponses.addAll(responses);
} else this.surveyResponses = responses;
}
Après l'addAll appeler le PersistentBag a un mélange d'ancien (géré) et nouveau (pas encore persisté) réponses. Lorsque j'appelle save (méthode jpa crudRepository de données de printemps) sur l'entité participant, toutes les anciennes réponses sont supprimées. Pourquoi?
Êtes-vous sûr à 100% que tout n'est pas retiré de la collection après removeIf()? Oui! vous l'avez mentionné mais avez-vous vraiment vu si dans le débogueur vous avez toujours des réponses attachées après removeIf()? –
Oui, j'ai couru ceci dans le débogueur, j'ai regardé comme le PersistentBag a eu un élément plus petit après le removeIf, il a eu un élément plus grand après le addAll. – JacobSTL