Nous avons cette relation:Mise en veille prolongée 5 + 2 JPA ne pas supprimer en cascade sur une table de jointure
public class RuleProviderEntity implements Serializable
{
...
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@OrderColumn(name = RuleEntity.RULE_SEQUENCE)
private List<RuleEntity> rules;
}
Ce seul crée une table de jointure avec 2 clés et la colonne RULE_SEQUENCE. Jusqu'ici bon et fonctionne pour des sélections.
Maintenant, il y a une requête JQL
DELETE FROM RuleProviderEntity WHERE ...
Mais cela ne fonctionne pas en cascade supprimer les RuleEntity
lignes. Il supprime simplement le RuleProviderEntity
et laisse le RuleEntity
intact.
Est-ce supposé fonctionner dans JPA 2 et c'est un bogue d'Hibernate, ou est-ce que je manque quelque chose dans la configuration?
Je sais que je pourrais ajouter @JoinTable
mais cela ne remplacerait que les valeurs par défaut.
Aussi orphanRemoval
semble pas nécessaire ici.
Peut-être que je pourrais faire une solution de contournement avec @PreRemove
mais je ne sais pas comment.
Ok merci. Je n'ai pas utilisé de suppression en bloc pour le moment, donc je ne l'ai jamais su :) Mais je suis assez surpris que la spécification ne nécessite pas de cascade en option. –
Ma façon de penser est la suivante: Il pourrait y avoir une entité qui possède le même ensemble de 'RuleEntityProvider' que le volume' DELETE'. Si j'appelais 'em.remove()' sur cela, cela cascera, et les entités 'RuleEntity 'imbriquées de niveau 3 seraient également supprimées. Alors pourquoi ne pas aussi cascade de l'instruction DELETE. –
Je ne vois pas pourquoi une cascade devrait être optionnelle. Bulk delete est là pour effectuer des opérations en masse sans avoir à extraire des données du magasin de données, et comme "cascading" nécessite que le fournisseur JPA passe tous les objets supprimés, élabore des cascades, puis supprime ceux-ci, cela ne peut pas être fait. –