我的应用程序中包含以下域:
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包含新的Term实例,并且没有问题。但是,当我从编辑页面删除一个术语并提交页面时,然后在SportController.update()方法中,Sport.terms Set仍然包含在页面上删除的Term实例。我确定此Term实例未提交(我检查了请求,但其中不包含请求),因此我怀疑Grails会以某种方式将其与Sport实例一起获取,但我不要求这样做。也许您有类似的经历?您能帮我吗?我已经花了大约5个小时来解决它。谢谢!
最佳答案
选项之一是将Set terms
转换为List terms
,这将使GORM删除并在每个save()
上重新创建集合
关于grails - 进行一对多动态表单提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27426955/