2014-12-11 2 views
1

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

ответ

1

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

Смежные вопросы