2015-01-19 3 views
0

У меня есть следующие классы Grails домена:Обновление HasMany связь в 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) 

} 

Есть ли способ, чтобы сделать эту работу?

ответ

0

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

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

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

    clone.save(flush : true) 
+0

Он работает в контроллере – confile

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