我有一个 grails 项目,其中有一个类,当我从 Controller “手动”执行该类时,我可以毫无问题地删除该类。我使用以下代码。
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)
}
}
这样就可以删除单个实例了。
现在我想从不同的 Controller 删除员工的所有项目。
这存储在员工中,如下所示:
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?
}
那么我现在如何从特定员工实例中删除所有项目?
最佳答案
我可能会误解你的问题,因为我无法理解你的一些代码。看来没有必要。如果您的关系设置正确(即项目属于员工),这应该足以删除单个项目:
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 方法,具体取决于要删除的关系数量。
关于java - 从 grails 的排序集中删除所有项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3918464/