Grails отправка динамической формы "один ко многим"

У меня есть следующие домены в моем приложении:

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 по-прежнему содержит экземпляр термина, который был удален на странице. Я уверен, что этот экземпляр Term не отправлен (я проверил запрос, и он не содержал его), поэтому я подозреваю, что Grails каким-то образом получает его вместе с экземпляром Sport, но я не прошу этого делать. Может у вас есть подобный опыт? Не могли бы вы помочь мне с этим, пожалуйста? Я уже потратил около 5 часов на ее решение. Спасибо!


person Andrey Yaskulsky    schedule 11.12.2014    source источник


Ответы (1)


Один из вариантов — превратить Set terms в List terms, что заставит GORM удалять и заново создавать коллекцию каждые save().

person injecteer    schedule 11.12.2014