удалить все элементы из отсортированного набора в граалях - PullRequest
0 голосов
/ 12 октября 2010

У меня есть проект 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)
    }
}

Так что удаляется один экземпляр штрафа.

Теперь я хочу, с другого контроллера, удалить ВСЕ проекты из сотрудника.

Это хранится в сотруднике следующим образом:

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?

}

Так как же теперь удалить все проекты из конкретного экземпляра сотрудника?

Ответы [ 2 ]

2 голосов
/ 13 октября 2010

Возможно, я неправильно понимаю ваш вопрос, потому что не могу разобраться в части вашего кода.Это кажется ненужным.Если ваши отношения настроены правильно (т. Е. Проект принадлежит Сотруднику), этого должно быть достаточно для удаления одного проекта:

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)
}

Если это один ко многим, в следующий раз, когда вы получите сотрудника,Проект исчезнет.И это должно работать, чтобы удалить все проекты сотрудника:

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)
}

Это предполагает каскад: "all-delete-orphan".Если это не так, то вам может понадобиться удалить экземпляры, и это может выглядеть примерно так:

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)
}

Я не отличный специалист, поэтому не уверен, нужна ли копия, или еслиВы можете просто перебирать коллекцию напрямую.Кажется, что всегда есть отличный способ сделать что-то.Вы также можете проверить метод динамического домена класса deleteFrom .Это может быть более эффективный подход grails в зависимости от количества удаляемых связей.

1 голос
/ 13 октября 2010

Вы можете использовать метод removeFrom *, который генерируется Grails при объявлении отношения hasMany - это эквивалент методов addTo *:

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