2010-02-01 14 views
10

Ich habe diese Art von Einheiten bestehen bleiben:Entfernte Einheit bestand Ausnahme

Dokument | n .. bis ..1 | Dokumenttyp | 1 .. bis .. n | PropertyType | 1 .. bis .. n | Document

ich einfach versuchen, ein Dokument zu entfernen, wie: entityManager.remove (document);

aber ein Fehler feuert:

16: 45: 51.499 Fehler [[Seam Ressourcen Servlet]] Servlet.service() zum Servlet Seam Ressourcen Servlet warf Ausnahme javax.persistence.EntityNotFoundException: gelöschte Einheit geben bestehen: [up.docstore.PropertyType #]

Das Problem scheint von hier zu kommen:

@OneToMany(mappedBy = "documentType", cascade = {CascadeType.ALL}, fetch = FetchType.EAGER) 
@ForeignKey(name = "FK_DOCUMENT_TYPE__PROPERTY_TYPE") 
@Sort(type = SortType.NATURAL) 
private SortedSet<PropertyType> propertyTypes = new TreeSet<PropertyType>(); 

Wenn ich CascadeType.PERSIST lösche, funktioniert alles. Aber ich brauche es dort und auch ich brauche es EAGERLY.

Kennt jemand andere Lösung?

Bearbeiten: entfernt DELETE_ORPHAN Kaskade, aber immer noch das gleiche Problem.

Antwort

12

Lösung:

  • Es gab eine CascadeType.REMOVE in einer @ManyToOne Beziehung! Entfernt es.

Warum diese Lösung?

  • wenn Sie ein Kind löschen möchten Sie sicherlich nicht wollen, seine Eltern löschen, weil es kann zu diesem Elternteil bezogen andere Kinder sein.
+3

yup - das war von uns versteckt, weil du es nicht gezeigt hast;) – Bozho

0

Ich sehe Sie setzen die cascade an zwei Stellen: die @OneToMany und die @Cascade. Ich denke, dass dies ein Problem sein kann, wenn man die andere überschreibt ...


Der Fehler, den Sie brauchen etwas mehr Kontext berichten verständlich zu sein. "Löschen einer bereits gelöschten Entität" beinhaltet eindeutig zwei Operationen .... Sie müssen Details über den Status vor, die Operationen und den Status danach angeben (mit "Status", ich meine den Status in der Datenbank ...).

+0

Hallo, ich habe soeben die DELETE_ORPHAN Kaskade, nur mit einer Lösung zu überwinden, aber es scheint, dass nicht das Problem ist. Jedenfalls mache ich einen einfachen Rest-Anruf durch DELETE, sende eine ID des Dokuments, das gelöscht wird, also ... ein sehr einfaches Szenario. –

+0

nach Hibernate Docs (Faul, um es jetzt zu suchen) die '@ Cascade' _adds_ zu dem JPA' cascade' Attribut, überschreibt es nicht. – Bozho

+0

@Bozho Danke für diese Präzision, in der Theorie ;-). Ich wünschte, jemand hätte das in der Praxis getestet, vielleicht Cristian? :-) – KLE

0

Es scheint so, als würden die Cascade-Optionen den Entity Manager dazu bringen zu glauben, dass dieses Objekt oder ein anderes Objekt in der Kette beim Aufruf von em.remove (document) beibehalten werden muss. Brauchen Sie mehr Details ...

6

Ich nehme an, Sie haben remove() auf einem Typ PropertyType zuvor genannt.Rufen Sie remove() nur für die „root“ Einheit, und entfernen Sie die anderen mit so etwas wie:

document.getDocumentType().getPropertyTypes().remove(propertyType); 

und behalten die DELETE_ORPHAN

Sie können dann, nachdem Sie die Überprüfung manuell nicht remove() auf andere genannt Aufruf Entitäten, versucht:

document = entityManager.merge(document); 
entityManager.remove(document); 

, so dass die EntityManager das Objekt mit der Sitzung ersten reassoziiert.

+0

Hallo Bozho. Ich rufe NUR zum Dokument auf, und ich erwartete, dass der Rest der Entitäten durch Kaskaden entfernt werden würde. Um document.getDocumentType() aufzurufen. GetPropertyTypes(). Remove (propertyType); Ich muss eine foreach auf propertyes setzen, und wenn ich eine entferne, wird eine Ausnahme ausgelöst, weil die Anzahl der Eigenschaftstypen nicht gleich bleibt ... –

+0

tripple überprüfen, ob Sie nicht aufrufen, entfernen Sie irgendwo;) dann sehen Sie meine update – Bozho

Verwandte Themen