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实际上是为我做这件事的,因为我没有用nobelongsTo
指定belongsTo关系,仍然可以用noFilter
和noUser
来回答。始终可以添加自定义约束或beforeInsert/beforeUpdate以防止发生这种情况。