子类对象无法删除

san*_*vi7 3 grails grails-orm grails-controller grails-domain-class

我有一些域类事件,问题,类别,影响,紧急等.

Class Incident
{
   Category category
   String subject
   Impact impact
}

Class Problem
{
     Urgency urgency
     Category category
     String title
}
Class Category
{
    String categoryName
    String description
}
Run Code Online (Sandbox Code Playgroud)

现在,一些行被插入到这个类中.现在,如果我删除类别,它会抛出错误,如'grails无法删除或更新父行'..所以我必须做什么删除?

Sud*_*r N 5

问题是 - 您在事件和问题类中引用了类别,因此这些类的数据库表将在类别表上具有外键,因此您无法删除类别,直到您删除这些事件/问题或更新这些事件问题和将category设置为null(您必须在域约束中将它们设置为可为空)

所以要么你做

Problem.executeUpdate('update Problem p set category = null where category = ?', [category])
Run Code Online (Sandbox Code Playgroud)

同样的事件

或者,您可以使用belongsTo和hasMany为您的域类建模,并且grails将自动处理所有事物

就像是

class Problem {
    static belongsTo = [category:Category]
}

class Category {
  static hasMany = [
     problems: Problem
 ]
 static mappings = {
   problems cascade: "all-delete-orphan"
 }
}
Run Code Online (Sandbox Code Playgroud)

我更愿意使用belongsTo,hasMany,hasOne来管理关系,而不是仅使用引用,它更好地表达模型.

这取决于您的域模型,在您的业务可以出现问题,事件存在没有类别!或者他们必须属于某个类别.如果你的答案是第一个选项,你不想级联删除,但是用null类别更新那些事件/问题,如果你的答案是第二个选项 - 你需要cascade all-delete-orphan