2017-04-27 2 views
1

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.

Répondre

3

Vous voulez dire qu'une requête JPQL Bulk Delete est émise? plutôt que em.remove().

Une requête Bulk Delete ne respecte JAMAIS la sémantique en cascade et n'est pas destinée à (elle ne conserve pas les objets gérés en mémoire compatibles avec la banque de données). Si vous voulez en cascade alors vous devez appeler em.remove(). En cas de doute à propos de ce regard sur la spécification JPA.

+0

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. –

+0

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. –

+0

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. –