2010-11-18 11 views
9

J'ai deux classes, disons Groupe et Personne avec une Relation ManyToMany qui est mappée dans un JoinTable.JPA/Hibernate: ManyToMany delete relation

Si je supprime une personne qui a une relation avec un groupe, je veux supprimer l'entrée de la table de jointure (ne pas supprimer le groupe lui-même!).

Comment dois-je définir les annotations en cascade? Je ne l'ai pas trouvé une documentation très utile, mais plusieurs discussions du conseil non résolues ...

public class Group { 
    @ManyToMany(
     cascade = { javax.persistence.CascadeType.? }, 
     fetch = FetchType.EAGER) 
    @Cascade({CascadeType.?}) 
    @JoinTable(name = "PERSON_GROUP", 
     joinColumns = { @JoinColumn(name = "GROUP_ID") }, 
     inverseJoinColumns = { @JoinColumn(name = "PERSON_ID") }) 
    private List<Person> persons;  
} 

public class Person { 
    @ManyToMany(
     cascade = { javax.persistence.CascadeType.? }, 
     fetch = FetchType.EAGER, 
     mappedBy = "persons", 
     targetEntity = Group.class) 
    @Cascade({CascadeType.?}) 
    private List<Group> group; 
} 

Répondre

0

Je crois que ce que vous voulez est:

cascade = CascadeType.ALL 

Pour supprimer la relation DB, supprimer l'association de chaque groupe . Supprimez la personne de la collection Group.persons et supprimez le groupe de la collection Person.group, puis persistez votre objet personne.

+0

Je souhaite supprimer l'association automatiquement lors de la suppression d'un objet personnel. Mon intention est de ne pas avoir à le faire manuellement. Si je dois, je n'ai pas besoin de cascade. Ou est-ce que j'ai eu une erreur sur la fonction Cascading? – tautologe

+0

Vous devez. Cascader ne le fait pas. –

3

Cascade ne sera pas nettoyer les références restantes à l'Person supprimé qui restent sur l'objet Group en mémoire. Vous devez le faire manuellement. Il semble que la cascade devrait le faire, mais malheureusement, ce n'est pas comme ça que ça fonctionne. Sur la base des informations fournies dans votre question, je ne pense pas que vous ayez besoin d'options en cascade sur vos entités Person ou Group. Il ne semble pas qu'ils partagent une relation parent/enfant où l'existence de l'un dépend de l'autre. C'est le genre de relation où je m'attendrais à voir des options en cascade.

+0

hmm ok, merci. BTW Y a-t-il une documentation utilisable de cascade et comment combiner les annotations JPA et Hibernate de manière sensée? – tautologe

+0

J'utilise Hibernate en tant que fournisseur, mais j'interagis uniquement avec lui via les interfaces JPA. Je ne suis pas la bonne personne pour répondre aux questions sur les annotations spécifiques à Hibernate. Pardon. –

0

Vous pouvez probablement le faire sur une base de données en particulier (dépend de votre base de données et ses capacités). En ajoutant "on delete cascade" à la clé étrangère de la table de relation.