2010-11-18 5 views
9

Ich habe zwei Klassen, sagen Gruppe und Person mit einer ManyToMany-Relation, die in einer JoinTable zugeordnet ist.JPA/Hibernate: ManyToMany löschen Relation

Wenn ich eine Person lösche, die eine Beziehung zu einer Gruppe hat, möchte ich den Eintrag aus der Join-Tabelle löschen (nicht die Gruppe selbst löschen!).

Wie muss ich die Kaskaden-Annotationen definieren? Ich habe nicht wirklich hilfreich Dokumentation aber mehrere ungelöste Board Diskussionen ...

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

Antwort

0

Ich glaube gefunden, was Sie wollen, ist:

cascade = CascadeType.ALL 

Um die DB Relation zu entfernen, entfernen Sie die Zuordnung von jeder Gruppe . Entfernen Sie die Person aus der Group.persons-Auflistung, und entfernen Sie die Gruppe aus der Person.group-Auflistung. Behalten Sie dann Ihr Personenobjekt bei.

+0

Ich möchte die Zuordnung automatisch löschen, wenn Sie ein Personenobjekt löschen. Meine Absicht ist, dies nicht manuell tun zu müssen. Wenn ich muss, brauche ich keine Kaskadierung. Oder habe ich die Cascading-Funktion falsch verstanden? – tautologe

+0

Sie müssen. Kaskadierung macht das nicht. –

3

Cascade wird nicht bereinigen die restlichen Referenzen auf die gelöschten Person, die auf dem Group Objekt im Speicher verbleiben. Sie müssen das manuell tun. Es scheint, als würde Kaskade dies tun, aber leider funktioniert das nicht so.

Basierend auf den Informationen in Ihrer Frage, ich glaube nicht, dass Sie keine Kaskadenoptionen auf Ihrem Person oder Group Einheiten benötigen. Es klingt nicht so, als ob sie eine Eltern-Kind-Beziehung teilen, in der die Existenz der einen von der anderen abhängt. Das ist die Art von Beziehung, in der ich einige Kaskadenoptionen erwarten würde.

+0

hmm ok, danke. übrigens. Gibt es irgendwo eine brauchbare Dokumentation der Kaskadierung und wie kann man die jpa- und Hibernate-Annotationen sinnvoll kombinieren? – tautologe

+0

Ich verwende Hibernate als Provider, aber ich interagiere nur mit ihm über die JPA-Schnittstellen. Ich bin nicht die richtige Person, um Fragen zu Hibernate-spezifischen Anmerkungen zu beantworten. Es tut uns leid. –

0

Sie können es wahrscheinlich in einer Datenbank (abhängig von Ihrer Datenbank und seinen Fähigkeiten) tun. Durch Hinzufügen von "on delete cascade" zum Fremdschlüssel der Beziehungstabelle.