我的申请中有以下域名:
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,我可以通过JavaScripts动态添加/删除术语,我有以下命名约定:
<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包含新的Term实例,并且没有任何问题。但是当我从编辑页面删除一个术语并提交页面时,然后在SportController.update()方法中运动.terms设置仍然包含在页面上删除的术语实例。我确定这个Term实例没有提交(我检查了请求并且它没有包含它)所以我怀疑Grails正在以某种方式将它与Sport实例一起取出但是我没有要求这样做。也许你有类似的经历?你能帮我解决这个问题吗?我已经花了大约5个小时来解决它。谢谢!
答案 0 :(得分:1)
其中一个选项是将Set terms
变为List terms
,这使GORM在每save()