JPA CascadeType.ALL nicht gelöscht Waisen
Frage
Ich habe Probleme beim Löschen von verwaisten Knoten JPA mit der folgenden Abbildung mit
@OneToMany (cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "owner")
private List<Bikes> bikes;
Ich bin das Problem der verwaisten Rollen mit rund um die Datenbank hängen.
kann ich die Anmerkung org.hibernate.annotations.Cascade
Hibernate bestimmten Tag verwenden, aber natürlich will ich nicht meine Lösung in eine Hibernate Implementierung binden.
Bearbeiten :. Es scheint, JPA 2.0 wird die Unterstützung hierfür ist
Lösung
Wenn Sie es mit Hibernate verwenden, müssen Sie explizit die Anmerkung CascadeType.DELETE_ORPHAN
zu definieren, die in Verbindung mit JPA CascadeType.ALL
verwendet werden können.
Wenn Sie nicht planen, Hibernate zu verwenden, werden Sie explizit müssen zuerst die untergeordneten Elemente löschen und löschen Sie dann den Hauptsatz alle verwaisten Datensätze zu vermeiden.
Ausführungssequenz
- holen Haupt-Zeile gelöscht werden
- holen Kind-Elemente
- löschen alle untergeordneten Elemente
- löschen Haupt Zeile
- close Sitzung
Mit JPA 2.0, können Sie nun die Option orphanRemoval = true
@OneToMany(mappedBy="foo", orphanRemoval=true)
Andere Tipps
Wenn Sie JPA 2.0 verwenden, können Sie nun das orphanRemoval=true
Attribut der @xxxToMany
Anmerkung verwenden, um Waisen zu entfernen.
Eigentlich CascadeType.DELETE_ORPHAN
hat in 3.5.2-Finale veraltet.
╔═════════════╦═════════════════════╦═════════════════════╗
║ Action ║ orphanRemoval=true ║ CascadeType.ALL ║
╠═════════════╬═════════════════════╬═════════════════════╣
║ delete ║ deletes parent ║ deletes parent ║
║ parent ║ and orphans ║ and orphans ║
╠═════════════╬═════════════════════╬═════════════════════╣
║ change ║ ║ ║
║ children ║ deletes orphans ║ nothing ║
║ list ║ ║ ║
╚═════════════╩═════════════════════╩═════════════════════╝
Wenn Sie JPA mit Eclipselink verwenden, werden Sie setzen müssen die @PrivateOwned Anmerkung.
Dokumentation: Eclipse-Wiki - Verwenden von Eclipse JPA Extensions - Kapitel 1.4 Wie das Verwenden von @PrivateOwned Annotation
Sie können @PrivateOwned verwenden Waisen löschen z
@OneToMany(mappedBy = "masterData", cascade = {
CascadeType.ALL })
@PrivateOwned
private List<Data> dataList;
Nach Java Persistence mit Hibernate , Kaskade Waise löschen ist nicht verfügbar als JPA-Annotation.
Es ist auch nicht in JPA XML unterstützt.
Ich habe gerade diese Lösung finden, aber in meinem Fall ist es nicht funktioniert:
@OneToMany(cascade = CascadeType.ALL, targetEntity = MyClass.class, mappedBy = "xxx", fetch = FetchType.LAZY, orphanRemoval = true)
orphanRemoval = true hat keine Auswirkungen.
Ich hatte das gleiche Problem, und ich fragte mich, warum diese Bedingung unten nicht die Waisen gelöscht hat. Die Liste der Gerichte wurden nicht in den Ruhezustand (5.0.3.Final) gelöscht, wenn ich einen Namen löschen Abfrage ausgeführt:
@OneToMany(mappedBy = "menuPlan", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Dish> dishes = new ArrayList<>();
Dann erinnerte ich mich, dass ich darf keine Namen Löschabfrage , aber die EntityManager verwenden. Als ich die EntityManager.find(...)
Methode verwendet, um die Einheit zu holen und sie dann löschen EntityManager.remove(...)
zu, wurden die Gerichte ebenfalls gelöscht.
Just @OneToMany(cascade = CascadeType.ALL, mappedBy = "xxx", fetch = FetchType.LAZY, orphanRemoval = true)
.
Entfernen targetEntity = MyClass.class , es funktioniert super.
Für die Aufzeichnungen, in OpenJPA vor JPA2 es war @ElementDependant.
Ich war mit 00.59 Mapping, aber Kind wurde nicht gelöscht bekommen JPA Fremdschlüsselverletzung gab
Nach der Verwendung von orphanRemoval = true Problem wurde behoben