2010-09-29 9 views
6

wieder gespeichert werden Ich habe das Projekt als Setup unten. Ich versuche, ein Projekt zu löschen, und ich erhalte die folgende:Grails gelöschtes Objekt würde durch Kaskadenfehler

2010-09-29 11:45:22,902 [http-8080-1] ERROR errors.GrailsExceptionResolver - deleted object would be re-saved by cascade (remove deleted object from associatio 
ns): [Project#204] 
org.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations): [Project#204] 
     at ProjectController$_closure6.doCall(ProjectController:50) 
     at ProjectController$_closure6.doCall(ProjectController) 
     at org.jsecurity.web.servlet.JSecurityFilter.doFilterInternal(JSecurityFilter.java:382) 
     at org.jsecurity.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:180) 
     at java.lang.Thread.run(Thread.java:619) 

Gibt es eine Möglichkeit, um mich überwintern zu sagen, welches Objekt die Referenz auf das Project-Objekt hat die neu gespeichert werden würde. Was ist falsch an meinem Projekt, das diese zirkuläre Ausnahme verursacht?

Antwort

9

Infact, die Art und Weise Sie die Zuordnung projects cascade:"all,delete-orphan" in der Employee-Klasse getan haben.

Sie müssen nur tun müssen:

def employee = project.employee; 
employee.removeFromProjects(project); 

und das Projekt wird ebenfalls gelöscht. Weitere Informationen finden Sie unter GORM Gotchas By Peter Ledbrook. Es ist ein 3-Serie und erklärt viele ähnliche Situationen

+2

Ich habe es endlich funktioniert. Es ist nicht so einfach. Ich denke, dass es einen Grals-Fehler gibt, wenn die Projekte in SortedSet gespeichert werden, dann ist es schwer, diese Entfernung durchzuführen. Ich musste eine Kopie der Projekte erstellen, die eine löschen, die ich löschen wollte, und sie dann dem Mitarbeiter hinzufügen, um dies zur Arbeit zu bringen – Derek

0

Wenn Sie eine Kaskade für das Löschen einrichten, wie Sie tun, müssen Sie das zu löschende Objekt aus dem übergeordneten löschen, bevor Sie es löschen. Von Ihrem Stacktrace in ProcectController um die Linie 50.

+0

Wenn Sie sagen "Objekt von seinem Elternteil zu löschen" bedeutet das, dass ich für dieses Beispiel Projekt vom Mitarbeiter entfernen muss, oder muss ich explizit den Baum hinuntergehen und alle Objekte entfernen, die gerade gelöscht werden sollen Eltern? – Derek

+0

Hier ist, wie ich das Entfernen von ProjectController tat: def employee = project.employee; \t employee.removeFromProjects (Projekt); project.delete (flush: true) – Derek

5

Ich weiß, es ist spät, aber jemand kann dies gerne hier finden: Was passiert ist, dass Hibernate Verwendungen ‚dirtyChecking‘, wie in GORM Gotchas By Peter Ledbrook erläutert.

Um es kurz zu machen: Hibernate, und so wird Grails am Ende der Hibernate-Session (in Ihrem Fall am .delete(flush:true) Anruf) zu save() das employee Objekt will, weil er erkennt, dass das Objekt (ein project modifiziert wurde, wurde unterdrückt). Und die employee muss einen Link in Richtung der project gehalten haben, verursacht Ruhezustand zu fühlen, dass Sie die project zu save() es wieder zurück.

Um dies zu umgehen:

def employee = project.employee; 
employee.discard(); 
project.delete(flush:true); 

nicht Hibernate Das sagen die employee ohne Sie zu fragen, dafür zu save().