Grails一对多/错误地删除所有“;manys“;

Grails一对多/错误地删除所有“;manys“;,grails,associations,gorm,one-to-many,Grails,Associations,Gorm,One To Many,我有以下(简化的)域类 class Filter { String name static hasMany = [answers:Answer] static belongsTo = [user:User] } class User { String name static hasMany = [answers:Answer, filters:Filter] } class Answer { String text } 然后,我为用户添加答案

我有以下(简化的)域类

class Filter {
    String name
    static hasMany = [answers:Answer]
    static belongsTo = [user:User]
}

class User {
    String name
    static hasMany = [answers:Answer, filters:Filter]
}

class Answer {
    String text
}
然后,我为用户添加答案,这是完美的工作。当我删除用户的1个答案时,会出现问题:

def delete = {
    def answer = Answer.get(params.id)
    def users = User.withCriteria() {
        answers{
            eq("id", answer.id)
        }
    }

    for (user in users)
        user.removeFromAnswers(answer)

    answer.delete(flush:true)
    redirect(action:"index")
}
这里发生的是删除所有用户-->应答关联

我只想删除这1个答案,因为所有答案都被使用了


我知道这与缺少的belongsTo有关,但我不能使用它,因为应答器可以属于用户或筛选器…

您可以添加
belongsTo
以将其设置为
可空的

class Answer {
    String text

    static belongsTo = [user:User, filter:Filter]
    static constraints = {
        user nullable:true
        filter nullable:true
    }
}
然后直接在控制器中删除
答案

def delete = {
    def answer = Answer.get(params.id)
    answer.delete(flush:true)
}

GORM将为您处理级联的其余部分。

mhh是的,这很有效。。。但也有可能得到一个没有过滤器和用户的答案。。。这就是为什么我尽量不使用belongsTo的原因。。。你的回答实际上与我所问的问题是正确的。我假设我实际想要的是与2个联合表的多对多关系:1个用于过滤器-->答案,1个用于用户-->答案。GORM实际上是为我做这件事的,因为我没有用no
belongsTo
指定belongsTo关系,仍然可以用no
Filter
和no
User
来回答
。始终可以添加自定义约束或beforeInsert/beforeUpdate以防止发生这种情况。