Я просто сталкиваюсь с этой же проблемой.
Домен моего приложения довольно прост: у него есть объекты-заглушки, которые имеют отношение hasMany с объектами заголовка. Поскольку объекты Header не имеют собственной жизни, они полностью управляются контроллером-заглушкой и представлениями.
Определения класса домена:
class Stub {
List headers = new ArrayList();
static hasMany = [headers:Header]
static mapping = {headers lazy: false}
}
class Header {
String value
static belongsTo = Stub
}
Я попробовал метод «clear and bind», но в результате «очищенные» объекты остались в базе данных, а grails просто создадут новые экземпляры для тех, которые не были удалены из отношения. Похоже, что он работает с точки зрения пользователя, но он оставит много мусорных объектов в базе данных.
Код в методе update () контроллера:
stubInstance.headers.clear()
stubInstance.properties = params
Пример: при редактировании -мани стороны этого отношения у меня (для данной заглушки с id = 1):
<g:textField name="headers[0].value" value="zero" id=1 />
<g:textField name="headers[1].value" value="one" id=2 />
<g:textField name="headers[2].value" value="two" id=3 />
в базе данных есть 3 экземпляра заголовка:
id=1;value="zero"
id=2;value="one"
id=3;value"two"
после удаления заголовка «один» и сохранения объекта-заглушки база данных будет иметь заголовки:
id=1;value="zero"
id=2;value="one"
id=3;value"two"
id=4;value="zero"
id=5;value="two"
и объект Stub теперь будет ассоциироваться с заголовками с id = 4 и id = 5 ...
Кроме того, без очистки списка, если индекс отсутствует в представленном списке request.headers, в гралях привязки данных будет сохраняться существующий объект в этом месте без изменений.
Решение, которое приходит мне в голову, заключается в том, чтобы связать данные, затем проверить заголовки заглушки на наличие элементов, которых нет в представленном списке, и удалить их.
Это похоже на довольно простой сценарий, разве нет встроенных функций для его решения?
Немного излишне писать собственную логику синхронизации для поддержания отношений, особенно когда причуды, которые делают его нетривиальным, вызваны самими граалями.
Как насчет удаления, не следует ли удалять элементы clear () из базы данных? Я что-то упускаю в определениях отношений или доменных объектов?