2013-08-21 3 views

Antwort

14

Ohne Zuordnung Ende Code ist ein bisschen schwer ... Dies wird in der Regel verursacht, weil Sie einen Objekt-Associate zu einer Sammlung löschen.
Sie haben Objekt zu entfernen, aus der Sammlung zu besitzen (s) und nach, löschen Objekt

parentObject.collection.remove(objToDelete); 
session.delete(objToDelete); 
session.save(parentObject); 

Aber man kann dies auf diese Weise

class ParentObject { 
    @OneToMany(orphanRemoval=true) 
    private List<ChildObject> collection; 
} 

und Code sieht abgebildet Sammlung mit deleteOrphan vermeiden wie

Sie brauchen das Löschen von Objekten nicht mehr, weil es beim Speichern von parentObject automatisch durch den Ruhezustand entfernt wird.

Hoffnung kann helfen

+1

Hibernate-Benutzer sollten dies für die verwaiste Entfernung verwenden @ Cascade ({org.hibernate.annotations.CascadeType.DELETE_ORPHAN}) – Akhilesh

5

Sie haben eine Entität (A) in der Sitzung gelöscht, aber es wird von einem anderen Unternehmen verweist und ist mit einer Cascade Anmerkung anotated. Dieser Verweis würde dazu führen, dass das Unternehmen (A) sofort wieder aufgenommen wird. Da dies wahrscheinlich nicht beabsichtigt ist, beklagt sich der Winterschlaf.

Die Lösung besteht darin, alle Referenzen (einschließlich Sammlungen) zu finden, über die die Entität erreichbar ist, und sie auf null festzulegen/die Entität aus der Sammlung zu entfernen.

Sie können Ihre Löschlogik umdrehen: Machen Sie den Verweis (wenn es nur einen gibt) ein Löschen-Waisenkind und entfernen Sie es dort einfach als @bellabax beschrieben.

2

Diese Ausnahme besagt, dass das Objekt, das Sie löschen, auch mit der Auflistung beliebiger Entitäten und Ihrer Kaskade in dieser Auflistungs-ID verknüpft ist. Also, wenn Sie irgendeine Art und Weise löschen möchten, können Sie Ihre Kaskade ändern

cascade = CascadeType.DETACH 
0

Wenn Sie dies über XML tun (und nicht Anmerkungen), unten ist eine Lösung, die für mich gearbeitet:

One-to -Viele Verbände:

  1. jede Verbindung des Kindes Objekt entfernen aus allen Sammlungen der geordnete Objekt [HINWEIS: Wenn Sie One-to-One Verein tun, nur setzen das Kind Objektverweis in das übergeordnete Objekt zu "null"]
  2. Löschen Sie das Kind Objekt aus der Datenbank
  3. bündig die Änderungen session.flush()
  4. Verknüpfen Sie das übergeordnete Objekt in das neue Kind-Objekt
  5. Speichern Sie das Objekt Elternteil mit 6) verpflichten sich die Änderungen

ACHTUNG: Sitzung.flush() ist wichtig, da der Ruhezustand die Änderungen sehen muss,

Wenn Sie die Sitzung nicht löschen können, würde ich Ihnen raten, Schritte (1,2) in einer anderen Transaktion zu tun und dann Schritte (4,5, 6) in einer neuen Transaktion.

Verwandte Themen