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

War es hilfreich?

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

  1. holen Haupt-Zeile gelöscht werden
  2. holen Kind-Elemente
  3. löschen alle untergeordneten Elemente
  4. löschen Haupt Zeile
  5. 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

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