У меня есть следующие домены в моем приложении: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 часов на это. Благодаря!