2010-11-18 26 views
9

Ho due classi, ad esempio Gruppo e Persona con una relazione ManyToMany mappata in una JoinTable.JPA/Hibernate: ManyToMany elimina la relazione

Se elimino una persona che ha una relazione con un gruppo, voglio eliminare la voce dalla tabella di join (non eliminare il gruppo stesso!).

Come è necessario definire le Annotazioni a cascata? Non ho trovato una documentazione molto utile, ma molte discussioni consiliari irrisolti ...

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; 
} 

risposta

0

Credo che ciò che si vuole è:

cascade = CascadeType.ALL 

Per rimuovere la relazione DB, rimuovere l'associazione di ogni gruppo . Rimuovi la persona dalla raccolta Group.persons e rimuovi il gruppo dalla raccolta Person.group, quindi proteggi il tuo oggetto persona.

+0

Desidero rimuovere l'associazione automaticamente quando si elimina un oggetto persona. La mia intenzione è di non doverlo fare manualmente. Se devo, non ho bisogno di cascata. O ho sbagliato la funzione Cascading? – tautologe

+0

Devi. Cascare non lo fa. –

3

Cascata non pulire i riferimenti rimanenti allo Person eliminato che rimangono nell'oggetto Group nella memoria. Devi farlo manualmente. Sembra che la cascata dovrebbe farlo, ma purtroppo non è così che funziona.

In base alle informazioni fornite nella domanda, non penso che sia necessario impostare le opzioni in cascata sulle entità Person o Group. Non sembra che condividano una relazione genitore/figlio in cui l'esistenza dell'uno dipende dall'altra. Questo è il tipo di relazione in cui mi aspetterei di vedere alcune opzioni a cascata.

+0

hmm ok, grazie. btw. esiste ovunque una documentazione utilizzabile della cascata e come combinare le annotazioni jpa e hibernate in modo sensato? – tautologe

+0

Uso Hibernate come provider ma interagisco solo con esso tramite le interfacce JPA. Non sono la persona giusta per rispondere alle domande sulle annotazioni specifiche di Hibernate. Scusate. –

0

Probabilmente è possibile farlo in un database specifico (dipende dal database e dalle sue capacità). Aggiungendo "on delete cascade" alla chiave esterna della tabella delle relazioni.

Problemi correlati