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