【发布时间】:2014-12-11 15:51:43
【问题描述】:
我的应用程序中有以下域:
class Sport implements Serializable {
Set terms
static hasMany = [terms: Term]
static mapping = {
terms cascade: "all-delete-orphan"
}
}
class Term implements Serializable {
String term
String tagCode
Sport sport
static constraints = {
sport nullable: false
}
static belongsTo = [sport: Sport]
static mapping = {
table "terms"
sport cascade: "save-update,merge"
}
}
及SportController更新方法:
@Transactional
def update(Sport sport) {
def sportInstance = sportService.update(sport)
....
}
我也有 edit.gsp,我可以在其中通过 JavaScript 动态添加/删除术语,并且我对它们有以下命名约定:
<ul>
<li>
<g:textField id="term${i}" name="terms[${i}].term"
required=""
value="${term?.term}"/>
</li>
<li>
<g:textField id="synonym${i}"
name="terms[${i}].synonym"
value="${term?.synonym}"/>
</li>
</ul>
当我添加新术语并提交 edit.gsp 时,一切正常:在 SportController.update() 方法中,sport.terms Set 包含新的术语实例,并且没有问题。但是当我从编辑页面中删除一个术语并提交页面时,在 SportController.update() 方法中,sport.terms Set 仍然包含在页面上删除的 Term 实例。我确定这个 Term 实例没有提交(我检查了请求并且它没有包含它)所以我怀疑 Grails 正在以某种方式获取它以及 Sport 实例,但我不要求这样做。也许你有类似的经历?你能帮我解决这个问题吗?我已经花了大约 5 个小时来解决它。谢谢!
【问题讨论】:
标签: grails grails-orm grails-domain-class grails-controller