grails - 进行一对多动态表单提交

标签 grails gorm grails-domain-class grails-controller

我的应用程序中包含以下域:

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/

相关文章:

mongodb - Grails MongoDB插件如何处理多态?

grails - 在hasMany关系中删除我的域的对象

Grails createCriteria group by(groupProperty 函数)多个属性

session - Grails过滤器在以下时间后停止工作

java - Grails智能获取war baseUrl?

grails - Groovy 在 list.find 调用上给出 NPE,但仅在一段时间之后

grails - 如何在 Grails 中使用嵌入的 GORM 类?

没有身份验证的Grails Spring Security插件访问控制/授权?

hibernate - Grails单向多对一和标准

grails - 如何转换Grails中的日期?