Frage

Ich habe ein Problem mit einer einfachen @OneToMany Zuordnung zwischen einem Elternteil und einem Kind Einheit. Alle gut funktionieren, nur dass die untergeordneten Datensätze nicht gelöscht werden, wenn ich sie aus der Sammlung zu entfernen.

Die Mutter:

@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 lösche und Kind aus dem Childs Set, es nicht aus der Datenbank gelöscht. Ich habe versucht, die child.parent Referenz zunichte gemacht, aber das hat nicht funktioniert entweder.

Die Entitäten in einer Web-Anwendung verwendet werden, geschieht das Löschen als Teil einer Ajax-Anfrage. Ich habe nicht eine Liste der gelöschten Childs, wenn die Speichertaste gedrückt wird, so kann ich sie implizit nicht löschen.

War es hilfreich?

Lösung

JPA Verhalten korrekt ist (dh gemäß der Spezifikation ): Objekte werden einfach nicht gelöscht, weil man sie aus einer OneToMany Sammlung entfernt hat. Es gibt herstellerspezifische Erweiterungen, die das aber einheimische JPA tun sorgen nicht für sie.

Dies ist zum Teil, weil JPA nicht wirklich wissen, ob es etwas aus der Sammlung entfernt löschen soll. In Objektmodellierung Begriffen, dies ist der Unterschied zwischen Zusammensetzung und „Aggregation *.

In Zusammensetzung , das Kind Einheit ohne die Eltern keine Existenz hat. Ein klassisches Beispiel ist zwischen Haus und Zimmer. Löscht das Haus und die Zimmer gehen auch.

Aggregation ist ein lockerer Art von Verein und wird von Kurs und Kursteilnehmer verkörpert. Löschen Sie den Kurs und der Student noch existiert (wahrscheinlich auch in anderen Kursen).

Sie müssen also entweder herstellerspezifische Erweiterungen verwenden, um dieses Verhalten zu erzwingen (falls vorhanden) oder explizit das Kind löschen und aus der Sammlung des Mutter entfernen.

Ich bin mir dessen bewusst:

Andere Tipps

Neben cletus' Antwort, JPA 2.0 , final seit Dezember 2010 stellt ein orphanRemoval Attribut auf @OneToMany Annotationen. Weitere Einzelheiten finden Sie in diesem Blogeintrag .

Man beachte, dass, da die Spezifikation noch relativ neu ist, sind nicht alle JPA 1-Provider eine endgültige JPA 2 Implementierung haben. Zum Beispiel rel="noreferrer"> die noch nicht dieses Attribut unterstützt.

Sie können versuchen, diese:

@OneToOne(orphanRemoval=true) or @OneToMany(orphanRemoval=true).

Wie bereits erläutert, ist es nicht möglich ist, zu tun, was ich mit JPA wollen, so beschäftigt ich die hibernate.cascade Anmerkung, mit diesem, der entsprechende Code in der übergeordneten Klasse sieht nun wie folgt aus:

@OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH}, mappedBy = "parent")
@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE,
            org.hibernate.annotations.CascadeType.DELETE,
            org.hibernate.annotations.CascadeType.MERGE,
            org.hibernate.annotations.CascadeType.PERSIST,
            org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
private Set<Child> childs = new HashSet<Child>();

Ich kann nicht einfach Gebrauch ‚ALL‘, wie dies auch die Eltern gelöscht hätte.

Sie können versuchen, diese:

@OneToOne(cascade = CascadeType.REFRESH) 

oder

@OneToMany(cascade = CascadeType.REFRESH)
@Entity 
class Employee {
     @OneToOne(orphanRemoval=true)
     private Address address;
}

Siehe hier .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top