J'ai une entité JPA "Request", qui possède une liste de réponses (également des entités JPA). Voilà comment il est défini dans Request.java:Pourquoi JPA ne supprime-t-il pas les entités possédées lorsque l'entité propriétaire perd leur référence?
@OneToMany(cascade= CascadeType.ALL, mappedBy="request")
private List<Answer> answerList;
Et Answer.java:
@JoinColumn(name = "request", referencedColumnName="id")
@ManyToOne(optional = false)
private Request request;
Au cours de l'exécution du programme, la liste des réponses de la demande peut avoir des réponses ajoutés ou supprimés de celui-ci, ou l'objet List réel peut être remplacé. Mon problème est ainsi: quand je fusionne une demande à la base de données, les objets de réponse utilisés pour être dans la liste sont conservés dans la base de données - c'est-à-dire, les objets de réponse que la demande ne contient plus (indirectement, via une liste) ne sont pas supprimés.
Ce n'est pas le comportement que je souhaite, comme si je fusionne une demande à la base de données, puis la récupère à nouveau, sa liste de réponses peut ne pas être la même. Est-ce que je fais une erreur de programmation? Existe-t-il une annotation ou un paramètre qui garantira que les réponses dans la base de données sont exactement les réponses dans la liste des demandes?
Une solution consiste à conserver les références à la liste des réponses d'origine, puis à utiliser EntityManager pour supprimer chaque ancienne réponse avant de fusionner la demande, mais il semble qu'il devrait y avoir une méthode plus propre.
Dans Hibernate, ceci peut être fait en utilisant CascadeType.DELETE_ORPHAN. –