Ich habe ein Problem mit einer einfachen @OneToMany
Zuordnung zwischen einer übergeordneten und einer untergeordneten Entität. Alles funktioniert gut, nur dass untergeordnete Datensätze nicht gelöscht werden, wenn ich sie aus der Sammlung entferne.
Das Elternteil:
@Entity
public class Parent {
@Id
@Column(name = "ID")
private Long id;
@OneToMany(cascade = {CascadeType.ALL}, mappedBy = "parent")
private Set<Child> childs = new HashSet<Child>();
...
}
Das Kind:
@Entity
public class Child {
@Id
@Column(name = "ID")
private Long id;
@ManyToOne(cascade = CascadeType.ALL)
@JoinColumn(name="PARENTID", nullable = false)
private Parent parent;
...
}
Wenn ich jetzt ein Kind aus dem Kinder-Set lösche, wird es nicht aus der Datenbank gelöscht. Ich habe versucht, die child.parent
Referenz aufzuheben , aber das hat auch nicht funktioniert.
Die Entitäten werden in einer Webanwendung verwendet, das Löschen erfolgt im Rahmen einer Ajax-Anfrage. Ich habe keine Liste der gelöschten Kinder, wenn die Schaltfläche Speichern gedrückt wird, daher kann ich sie nicht implizit löschen.
Zusätzlich zur Antwort von cletus führt JPA 2.0 , das seit Dezember 2010 endgültig ist, ein
orphanRemoval
Attribut für@OneToMany
Anmerkungen ein. Weitere Details finden Sie in diesem Blogeintrag .Da die Spezifikation relativ neu ist, verfügen nicht alle JPA 1-Anbieter über eine endgültige JPA 2-Implementierung. Beispielsweise unterstützt die Version Hibernate 3.5.0-Beta-2 dieses Attribut noch nicht.
quelle
Sie können dies versuchen:
@OneToOne(orphanRemoval=true) or @OneToMany(orphanRemoval=true)
.quelle
Wie bereits erläutert, ist es mit JPA nicht möglich, das zu tun, was ich möchte. Daher habe ich die Annotation hibernate.cascade verwendet. Damit sieht der relevante Code in der Parent-Klasse jetzt folgendermaßen aus:
Ich konnte nicht einfach 'ALL' verwenden, da dies auch den Elternteil gelöscht hätte.
quelle
Hier bedeutet Kaskade im Zusammenhang mit Entfernen, dass die untergeordneten Elemente entfernt werden, wenn Sie das übergeordnete Element entfernen. Nicht der Verein. Wenn Sie Hibernate als Ihren JPA-Anbieter verwenden, können Sie dies mithilfe einer spezifischen Ruhekaskade tun .
quelle
Sie können dies versuchen:
oder
quelle
Siehe hier .
quelle