2010-10-12 4 views
0

J'ai un projet grails avec une classe que je ne peux supprimer aucun problème en le faisant "manuellement" depuis le contrôleur. J'utilise le code suivant.supprimer tous les articles de set tried in grails

def delete = { 
    def projectInstance = Project.get(params.id) 
    def employee = projectInstance.employee 
    def projectarray = new ArrayList<Project>(); 
    projectarray += employee.getProjects() 
    println("Size of projectarray is " + projectarray.size()) 
    if(projectInstance) { 
     def rolearray = [] 

     projectarray.remove(projectInstance) 
     def temp = new TreeSet<Project>(); 
     temp += employee.getProjects() 
     temp.clear() 
     temp.addAll(projectarray) 
     employee.projects = temp 

     projectInstance.employer = null 
     projectInstance.delete(flush:true) 
     flash.message = "Project ${params.id} deleted" 
     redirect(action:"edit", controller: "employee", id: employee.id) 
    } 
    else { 
     flash.message = "Project not found with id ${params.id}" 
     redirect(action:list) 
    } 
} 

Ainsi, cela supprime une instance unique.

Maintenant, je veux, à partir d'un contrôleur différent, supprimer tous les projets d'un employé.

Il est stocké dans l'employé comme ceci:

class Employee implements Comparable 
{ 
static hasMany = [projects:Project] 
static constraints = 
{ 
} 

static mapping = { 
    projects cascade:"all-delete-orphan", lazy:false 
} 

@XmlElementWrapper(name="projectslist") 
SortedSet<Project> projects = new TreeSet<Project>(); // make a sortedSet? 

} 

Alors, comment pourrais-je maintenant supprimer tous les projets d'une instance d'un collaborateur?

Répondre

2

je pourrais être mal compris votre question parce que je ne peux pas donner un sens de certains de votre code. Cela semble inutile. Si vos relations sont configurés correctement (c.-à-projet belongsTo employés), cela devrait être suffisant pour supprimer un seul projet:

def delete = { 
    def projectInstance = Project.get(params.id) 
    projectInstance.delete(flush:true) 
    flash.message = "Project ${params.id} deleted" 
    redirect(action:"edit", controller: "employee", id: employee.id) 
} 

Si cela est un à plusieurs, la prochaine fois que vous récupérez l'employé Le projet être parti. Et cela devrait fonctionner pour supprimer tous les projets d'un employé:

def delete = { 
    def employee = Employee.get(params.id) 
    employee.getProjects().clear() 
    employee.save(flash:true) 
    flash.message = "All projects of employee deleted." 
    redirect(action:"edit", controller: "employee", id: employee.id) 
} 

Cela suppose cascade: "all-delete-orphelin". Si ce n'est pas le cas, vous devrez peut-être supprimer aussi les instances et qui pourrait ressembler à ceci:

def delete = { 
    def employee = Employee.get(params.id) 

    // Make copy to avoid concurrent modification issues later 
    def copy = new TreeSet<Project>(employee.getProjects()); 

    employee.getProjects().clear(); 
    employee.save(flash:true) 

    copy.each{ 
     $it.delete(); 
    }  

    flash.message = "All projects of employee deleted." 
    redirect(action:"edit", controller: "employee", id: employee.id) 
} 

Je ne suis pas un expert groovy, donc je ne sais si la copie est nécessaire, ou si vous le pouvez juste itérer sur la collection directement. On dirait qu'il y a toujours une façon plus groovy de faire les choses. Vous pouvez également consulter la méthode de classe de domaine dynamique deleteFrom. Cela pourrait être une approche de grails plus efficace en fonction du nombre de relations à supprimer.

+0

Je pense peut-être que j'ai besoin d'un exemple plus élaboré. Je vais voir si je peux travailler quelque chose demain et l'afficher. – Derek

+0

Il s'est avéré que c'était correct - ce qui est plus ou moins ce que j'avais. Le problème était avec quelques cascades mal installées. – Derek

1

Vous pouvez utiliser la méthode removeFrom* qui est généré par Grails lorsque vous déclarez la relation hasMany - il est l'équivalent des méthodes addTo*:

def employee = Employee.get(params.id) 
employee.projects.toList().each { employee.removeFromProjects(it) } // toList() prevents a ConcurrentModifactionException 
Questions connexes