Обновление отношения HasMany в контроллере Grails

У меня есть следующие классы домена grails:

A {
 belongsTo = [b: B]
}

B {
 hasMany = [aClasses: A]
}

В представлении GSP у меня есть форма, в которой пользователь может выбрать множество экземпляров A, чтобы связать их с экземпляром B. Когда пользователь отправляет форму, контроллер, который обрабатывает форму, получает что-то вроде этого:

params: [aClasses: [123,124]]

Пользователь мог удалить ранее добавленные aClasses из B, поэтому я сначала попытался очистить aClasses из B, а затем выполнить addTo, но я получил java.util.ConcurrentModificationException.

Вот что я делаю в своем действии контроллера:

def update() {
B b = B.get(params.id)
b.properties = params
b.aClasses.clear()

def newAs = params.aClassIds ? [] + params.aClasses : []
newAs.each {
 A a = A.get(it)
 b.addToAClasses(a)
}
b.save(flush: true)

}

Есть ли способ заставить это работать?


person confile    schedule 19.01.2015    source источник


Ответы (1)


Это работает в службе или контроллере? Я делал нечто подобное раньше, но логика была в сервисе, и это сработало. Этот вид доступа к базе данных должен выполняться в службе, потому что они транзакционные.

Пример, который сработал:

    if(!clone.hasErrors())
    {
        def projectTasks = Task.withCriteria {
            project {
              eq('id', project_id.toInteger())
            }
          }
        projectTasks.each{ task -> 
            clone.addToTasks(task)
        }
    }

    clone.save(flush : true)
person Alfredo    schedule 19.01.2015
comment
Он работает в контроллере - person confile; 19.01.2015