2017-10-28 3 views
0

Ich habe ein Problem mit OrphanRemoval. Wenn ich Mitglied lösche und wenn keine anderen referenzierten Beziehungen für Mitglieder vorhanden sind, sollte diese Beziehung gelöscht werden. Aber das ist nicht der Fall. Gibt es den Moyen, dies mit JPA-Konfigurationen zu tun, oder sollte ich Logik in Service schreiben?Nach dem Löschen Mitglied die Relation ist nicht gelöscht

public class Member { 
    @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
    public RelationEntity getBornRelation() { 
     return bornRelation; 
    } 
} 

public class Relation { 
    @OneToMany(fetch = FetchType.EAGER, orphanRemoval = true, cascade = CascadeType.ALL) 
    @JoinColumn(name = "bornrelation") 
    public List<MemberEntity> getChildren() { 
     return children; 
    } 
} 

Antwort

1

Zunächst einmal haben Sie zwei separate Verbindungen zwischen Member und Relation definiert. Ich vermute, das war nicht beabsichtigt. Wenn Sie die Zuordnung bidirektional beibehalten möchten, müssen Sie die "Eins" -Seite zur Eigentümerseite der Assoziation machen, indem Sie mappedBy="bornRelation" zur @OneToMany hinzufügen. Andernfalls werden Änderungen an Member.bornRelation nicht in Relation.children widergespiegelt und umgekehrt.

Zweitens, tun Sie nicht verwenden Sie CascadeType.ALL mit @ManyToOne. CascadeType.ALL bedeutet CascadeType.REMOVE und ein Versuch, die "eine" Seite der Zuordnung zu entfernen, wird fehlschlagen, solange die Seite "viele" noch andere untergeordnete Entitäten enthält, die sich auf die übergeordnete Entität beziehen. JPA prüft nicht, ob das Löschen möglich ist. Es wird einfach eine DELETE an die Datenbank ausgeben, was zu Constraint-Verletzungen führt.

(Sie halten CascadeType.ALL mit @OneToMany verwenden, aber denken Sie daran, dass Sie noch brauchen, um sicherzustellen, dass Member.bornRelation richtig eingestellt, wenn neue Elemente Relation.children hinzufügen. JPA wird nicht das für Sie kümmern)

ich das glauben oben beantwortet bereits deine Frage. Was Sie wollen, kann nicht nur durch die JPA-Konfiguration erfolgen. Sie benötigen zusätzliche Logik, um zu überprüfen, ob das zu löschende Relation das letzte untergeordnete Element der übergeordneten Entität ist. Dies hat übrigens nichts mit der Beseitigung von Waisen zu tun. Beim Entfernen verwaister Objekte werden untergeordnete Entitäten (und keine übergeordneten Entitäten) entfernt.

+0

Vielen Dank für Ihre Antwort .. Ich habe es auf andere Weise versucht ... Wenn ich mappedBy in OneToMany verwende, wenn ich ein Kind zu dieser Relation hinzufüge, wird dies nicht von der Memberseite aktualisiert. Also ... ich habe beschlossen, Annotation JoinColumn auf OneToMany-Seite hinzuzufügen. Und es funktioniert so, wie ich es erwarte. – VANILKA

+0

Wie ich schon sagte, sobald Sie 'mappedBy' hinzufügen, wird' Member.bornRelation' zur * besitzenden * Seite der Assoziation. Das bedeutet, dass Sie die Verbindung nur herstellen/aktualisieren können, indem Sie 'Member.bornRelation' auf einen geeigneten Wert setzen. Änderungen an Relation.children werden ignoriert, da diese Seite nicht die Besitzerseite ist. Gleichzeitig kann die "viele" Seite nicht die besitzende Seite einer bidirektionalen Eins-zu-Viele-Assoziation sein. Um es zur Besitzerseite zu machen, müssen Sie die Zuordnung unidirektional machen, indem Sie "Member.bornRelation" ganz entfernen. – crizzis

+0

ok .. jetzt verstehe ich. Danke für die Erklärung – VANILKA

Verwandte Themen