grails one-to-many动态表单提交

时间:2014-12-11 15:51:43

标签: 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,我可以通过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个小时来解决它。谢谢!

1 个答案:

答案 0 :(得分:1)

其中一个选项是将Set terms变为List terms,这使GORM在每save()

时删除并重新创建集合