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.
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
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
ok .. jetzt verstehe ich. Danke für die Erklärung – VANILKA