2010-09-29 17 views
6

द्वारा पुनः सहेजा जाएगा, मेरे पास प्रोजेक्ट नीचे सेट अप है। मैं एक परियोजना को हटाने के लिए कोशिश कर रहा हूँ, और मैं निम्नलिखित मिल:grails हटाए गए ऑब्जेक्ट को कैस्केड त्रुटि

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) 

वहाँ किसी भी तरह से मुझे बताने की जो वस्तु संदर्भ वापस कि होगा पुन: सहेजना परियोजना वस्तु के लिए है हाइबरनेट करने के लिए है। मेरे प्रोजेक्ट के साथ क्या गलत है जो इस परिपत्र अपवाद का कारण बन रहा है?

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 

    } 
} 

उत्तर

9

दरअसल, जिस तरह से आप मानचित्रण projects cascade:"all,delete-orphan" कर्मचारी वर्ग में किया है से।

तुम बस करने की आवश्यकता होगी:

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

और परियोजना के रूप में अच्छी तरह से हटा दिया जाएगा। अधिक जानकारी के लिए, GORM Gotchas By Peter Ledbrook देखें। यह एक 3 हिस्सा श्रृंखला और बताते हैं कई इसी तरह की परिस्थितियों

+2

मुझे अंत में यह काम मिल गया। यह वास्तव में सरल नहीं है। मुझे लगता है कि अगर परियोजनाओं को सॉर्टेडसेट में संग्रहीत किया जाता है तो एक grails बग है, तो इसे हटाने में मुश्किल हो रही है। मुझे परियोजनाओं की प्रतिलिपि बनाना था, जिसे मैं हटाना चाहता था उसे हटा देना था, फिर इसे काम करने के लिए उन्हें वापस कर्मचारी में जोड़ें – Derek

0

अगर आप हटाना सेटअप के लिए झरना है, जैसे आप करते हैं, आप को हटाने से पहले वस्तु-नष्ट करने के लिए अपने माता पिता से दूर करने के लिए की जरूरत है। रेखा के आसपास ProcectController में अपने स्टैकट्रेस 50.

+0

जब आप कहते हैं कि "अपने माता-पिता से हटने के लिए ऑब्जेक्ट" का अर्थ यह है कि इस परीक्षा के लिए मुझे कर्मचारी से परियोजना को हटाने की ज़रूरत है, या क्या मुझे स्पष्ट रूप से पेड़ को नीचे जाना होगा सभी वस्तुओं को हटाने के लिए उनके द्वारा हटाए जाने वाले हैं माता-पिता? – Derek

+0

यहां बताया गया है कि मैं ProjectController से हटा रहा था: def कर्मचारी = project.employee; \t कर्मचारी.removeFromProjects (प्रोजेक्ट); project.delete (फ्लश: सच) – Derek

5

मैं जानता हूँ कि यह देर हो चुकी है लेकिन कोई इस यहाँ खोजने के लिए पसंद कर सकते हैं: क्या होता है कि हाइबरनेट का उपयोग करता है 'dirtyChecking', GORM Gotchas By Peter Ledbrook में बताई गई विधि है।

बातें कम करने के लिए: हाइबरनेट, और इसलिए Grails save() को हाइबरनेट सत्र के अंत में employee वस्तु (.delete(flush:true) कॉल पर अपने मामले में) चाहते हैं, क्योंकि यह पता लगाता है कि वस्तु संशोधित किया गया है (एक project दबा दिया गया है)। और employee ने project की तरफ एक लिंक रखा होगा, जिससे हाइबरनेट आपको लगता है कि delete()project से save() पर वापस आ जाएगा।

इस समाधान के लिए:

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

यह बता आप इसके लिए बिना पूछे employeesave() के लिए नहीं हाइबरनेट।

संबंधित मुद्दे