Grails GORM自引用belongs从预期值中删除相反方向的内容

Grails GORM自引用belongs从预期值中删除相反方向的内容,grails,gorm,belongs-to,Grails,Gorm,Belongs To,我有一个Grails域类,它是一个类别层次结构。每个类别都有一个父类别(根类别为空除外) 我的问题是:与我的预期完全相反: someSubCategory.delete()删除该类别,然后尝试删除父类别(如果父类别有其他子类别,则会因完整性冲突而失败) parentCategory.delete()不会级联删除其子级,而是会因完整性冲突而失败 我做错了什么?我的理解是,上面的“belongsTo”应该告诉GORM将删除从父项级联到所有子项,而不是从子项级联到父项 这不是答案,但我找到了解决我

我有一个Grails域类,它是一个类别层次结构。每个类别都有一个父类别(根类别为空除外)

我的问题是:与我的预期完全相反:

  • someSubCategory.delete()删除该类别,然后尝试删除父类别(如果父类别有其他子类别,则会因完整性冲突而失败)
  • parentCategory.delete()不会级联删除其子级,而是会因完整性冲突而失败

我做错了什么?我的理解是,上面的“belongsTo”应该告诉GORM将删除从父项级联到所有子项,而不是从子项级联到父项

这不是答案,但我找到了解决我自己问题的办法。您可以删除belongsTo=[parent:Category],将其替换为一个简单的实例变量。这将停止subCategory.delete()与父级的级联

class Category {
    String name
    Category parent

    static mapping = {
        cache true
        name index:'category_name_idx'
    }

    static constraints = {
        parent(nullable:true)
    }
}

如果我理解正确,一个类别属于一个父类,并且一个父类可以有多个子类,那么我认为您需要一个hasMany关系,类似这样的关系:

class Category {
    String name

    static mapping = {
        cache true
        name index:'category_name_idx'
    }

    static belongsTo = [parent:Category]
    static hasMany = [children: Category]

    static constraints = {
        parent(nullable:true)
    }
}
我曾经有过类似的结构,从来并没有和删除这样做的问题


希望这有帮助

谢谢,@maricel!事后看来很明显。。。我觉得有点傻。在我的团队中,我们用同样的方法解决这个问题。我们还包括一个瞬态对象“childrenCategories”来获取childrenCategories是的,我也添加了一个childrenCategories。为了在删除父对象时删除子对象,我实现了GORM“beforeDelete”事件:def beforeDelete={Category.withNewSession{childrenCategories*.delete()}感谢您的提示。如果我早点知道,我就不必实现delete函数:)我们必须为“childrenCategories”变量指定hasMany关系吗?在删除{}之前,我们什么时候调用该操作?因为正如我在您的实现中看到的,我们没有告诉Grails知道childrenCategories属于哪个类别。或者在删除Category实例之前会自动调用它?@Napoleorit76:对于子对象,我没有使用变量,而是使用如下方法:def getChildrenCategories(){Category.findAllByParent(this,[sort:'name'])}。而且您不会在beforeDelete之前调用它:Grails会在执行其内置的delete之前自动调用它。
class Category {
    String name

    static mapping = {
        cache true
        name index:'category_name_idx'
    }

    static belongsTo = [parent:Category]
    static hasMany = [children: Category]

    static constraints = {
        parent(nullable:true)
    }
}