wake-up-neo.net

Untergeordnetes Element und untergeordnetes Element automatisch mit untergeordneten JPA-Anmerkungen löschen

Angenommen, wir haben die Objektklasse 3 Entities:

class Parent {
    String name;
    List<Child> children;
}

class Child {
    String name;
    Parent parent;
}

class Toy {
    String name;
    Child child;
}

Wie kann ich JPA2.x (oder Ruhezustand) -Anmerkungen verwenden, um:

  1. Alle untergeordneten Elemente automatisch löschen, wenn das übergeordnete Objekt gelöscht wird (eins bis viele)
  2. Untergeordnetes Verzeichnis automatisch löschen, wenn es gelöscht wird (viele zu eins)
  3. Spielzeug automatisch löschen, wenn Kind entfernt wird (eins zu eins)

Ich verwende Hibernate 4.3.5 und MySQL 5.1.30.

Vielen Dank

11
user1079877

Wie in diesem Artikel erläutert, sollte die removeEntity State Transition von Eltern zu Kindern kaskadieren, nicht umgekehrt.

Sie brauchen so etwas:

class Parent {
    String name;
    @OneToMany(mappedBy = "parent", fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
    List<Child> children;

    public void addChild(Child child) {
        child.setParent(this);
        children.add(child);
    }

    public void removeChild(Child child) {
        children.remove(child);
        if (child != null) {
            child.setParent(null);
        }
    }
}

class Child {
    String name;
    @ManyToOne
    Parent parent;

    @OneToOne(mappedBy = "child", cascade = CascadeType.ALL, orphanRemoval = true)
    Toy toy;
}

class Toy {
    String name;

    @OneToOne
    Child child;
}
18
Vlad Mihalcea

Sie sollten CascadeType.REMOVE verwenden. Dies ist die übliche Annotation für Hibernate und JPA. Hibernate hat einen anderen ähnlichen Typ CacadeType wie CascadeType.DELETE.

  1. Alle untergeordneten Elemente automatisch löschen, wenn das übergeordnete Objekt gelöscht wird (eins bis viele)

    class Parent {
      String name;
    
      @OneToMany(cascade = CascadeType.REMOVE)
      List<Child> children;
    }
    
  2. Untergeordnetes Verzeichnis automatisch löschen, wenn es gelöscht wird (viele zu eins)

    class Child {
     String name;
     @ManyToOne(cascade = CascadeType.REMOVE)
     Parent parent;
    }
    
  3. Spielzeug automatisch löschen, wenn Kind entfernt wird (eins zu eins)

    class Toy {
      String name;
      @OneToOne(cascade = CascadeType.REMOVE)
      Child child;
    }
    
7
Masudul

orphanRemoval ist alle löschen Beispiel für ein verwaistes Objekt: Laden hat Bücher (b1, b2, b3) und b1 hat Titel (t). In diesem Fall werden einige Bücher (b2, b3) gelöscht. B2 und t existieren noch. Wenn Sie "cascade= CascadeType.Remove" verwenden, werden nur die Bücher gespeichert, und alle Bücher werden gelöscht (nur "t" ist vorhanden).

s->b1,b2,b3 b2->t ------after(orphanRemoval = true)--------- b2->t

s->b1,b2,b3 b2->t ------ after(cascade=CascadeType.REMOVE)--------- t

Wenn orphanRemoval = true angegeben ist, wird die getrennte Entitätsinstanz automatisch entfernt. Dies ist nützlich, um abhängige Objekte zu bereinigen, die nicht ohne eine Referenz von einem Eigentümerobjekt vorhanden sein sollten.

Wenn nur cascade=CascadeType.REMOVE angegeben ist, wird keine automatische Aktion ausgeführt, da das Trennen einer Beziehung keine Entfernungsoperation ist.

1