grails gelöschte Objekt erneut gespeichert werden, die laut cascade einen Fehler
Habe ich das Projekt als set-up unten. Ich bin versucht, um ein Projekt zu löschen, und ich bekomme die folgende:
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 zu überwintern, um mir zu sagen, welches Objekt die Referenz zurück auf das Projekt-Objekt, dass würde erneut gespeichert werden. Was ist Los mit meinem Projekt aufgesetzt, wodurch dieses Rundschreiben Ausnahme?
public class Project implements Comparable
{
static belongsTo = [employee:Employee]
static hasMany = [roles:Role]
static constraints = {
}
static mapping = {
description type:"text"
roles lazy:false, cascade:"all,delete-orphan"
client lazy:false, cascade:"all,delete-orphan"
employer lazy:false, cascade:"all,delete-orphan"
}
}
class Employee implements Comparable
{
static hasMany = [employeeDesiredSkills:EmployeeDesiredSkill,
employeeDesiredTools:EmployeeDesiredTool,
employeeAreasOfExpertise:EmployeeAreaOfExpertise,
projects:Project,
education:Education]
static mapping = {
employeeDesiredSkills cascade:"all,delete-orphan", lazy:false
employeeDesiredTools cascade:"all,delete-orphan", lazy:false
education cascade:"all,delete-orphan", lazy:false
projects cascade:"all,delete-orphan", lazy:false
}
}
public class Role implements Comparable
{
static belongsTo = [project:Project]
static hasMany = [roleSkills:RoleSkill,roleTools:RoleTool]
static mapping = {
duties type:"text"
roleSkills cascade:"all,delete-orphan", lazy:false
roleTools cascade:"all,delete-orphan", lazy:false
locationType cascade:"all,delete-orphan", lazy:false
}
static contraints = {
endDate(nullable: true)
roleSkills(nullable: true)
roleTools(nullable: true)
}
}
class Employer implements Comparable
{
static mapping = {
type lazy:false, cascade:"all,delete-orphan"
}
}
class RoleTool implements Comparable
{
static belongsTo = [role:Role, tool:Tool]//not sure this makes sense, but have to leave it or DB breaks
Tool tool = new Tool(name:"")
static mapping = {
tool cascade:"save-update", lazy:false
}
class RoleSkill implements Comparable
{
static belongsTo = [role:Role, skill:Skill]//not sure this makes sense, but have to leave it or DB breaks
Skill skill = new Skill(name:"")
static mapping = {
skill cascade:"save-update", lazy:false
}
}
class Skill implements Comparable
{
static hasMany = [roleSkills:RoleSkill, employeeDesiredSkills:EmployeeDesiredSkill]
static mapping = {
roleSkills cascade:"all,delete-orphan", lazy:false
employeeDesiredSkills cascade:"all,delete-orphan", lazy:false
}
}
class Tool implements Comparable
{
static hasMany = [roleTools:RoleTool, employeeDesiredTools:EmployeeDesiredTool]
static mapping = {
roleTools cascade:"all,delete-orphan", lazy:false
employeeDesiredTools cascade:"all,delete-orphan", lazy:false
}
}
InformationsquelleAutor Derek | 2010-09-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Infact, die Weise, die Sie getan haben, die Zuordnung
projects cascade:"all,delete-orphan"
in der Employee-Klasse.
Müssen Sie einfach tun:
Wird das Projekt gelöscht.
Für mehr details, siehe GORM Fallstricke Von Peter Ledbrook.
Seine ein 3 Teil der Serie und erklärt viele ähnliche Situationen
InformationsquelleAutor Himanshu
Ich weiß, es ist spät, aber kann jemand wie finden diese hier:
Was passiert, ist, dass Hibernate verwendet 'dirtyChecking', wie in GORM Fallstricke Von Peter Ledbrook.
Um es kurz zu machen:
Hibernate und Grails so wollen
save()
dieemployee
Objekt am Ende der Hibernate-session (in Ihrem Fall bei der.delete(flush:true)
nennen), weil es erkennt, dass das Objekt geändert wurde (einproject
unterdrückt wurde). Und dieemployee
muss immer eine Verbindung in Richtung derproject
verursacht Ruhezustand fühlen Siedelete()
dieproject
zusave()
es wieder zurück.Zur Umgehung dieses:
Diesem sagen Hibernate nicht
save()
dieemployee
ohne Sie zu Fragen.InformationsquelleAutor Alexandre Bourlier
wenn Sie cascade delete-setup, wie Sie es tun, müssen Sie das Objekt entfernen, zu löschen, die von Ihren Eltern, bevor Sie Sie löschen. Von Ihrem stacktrace in ProcectController um die Zeile 50.
Hier ist, wie ich Tat, war das entfernen von ProjectController: def Mitarbeiter = Projekt.Mitarbeiter; Mitarbeiter.removeFromProjects(project); project.delete(flush:true)
InformationsquelleAutor hvgotcodes