2013-02-26 2 views
2

В моем текущем проекте я не могу продолжать отношения «один ко многим». Обе стороны отношений будут сохранены - просто отсутствует связь между ними.Не удается сохранить отношения «один ко многим»

Один-ко-многим между моими двумя доменами выглядит следующим образом:

class Parent { 
    String name 
    ... 

    static hasMany = [childs: Child] 

    Parent() {} 

    Parent(SomeOtherClass obj) { 
     this.properties = obj.properties 
    } 
} 

class Child { 
    int code 
    String description  
} 

Я создаю мои Parent экземпляры в ParentService:

public Boolean createParents(List parentIds) { 
    boolean savedSuccessfully = true 
    Parent.withTransaction {status -> 
     parentIds.each { parentIdString -> 
      if (parentIdString && parentIdString.isInteger()) { 
       int parentId = parentIdString.toInteger() 

       def parentInstance = new Parent(someOtherService.getExternalParentObj(parentId)) 

       someOtherService.getExternalChilds(parentId).each { entry -> 
        parentInstance.addToChilds(Child.findOrSaveWhere(code: entry.key, description: entry.value)) 
       } 

       if(!parentInstance.save()) { 
        status.setRollbackOnly() 
        savedSuccessfully = false 
       } 
      } 
     } 
    } 

    return savedSuccessfully 
} 

И, в Parent экземпляры и экземпляры Child создаются и сохраняются успешно. Просто отсутствует связь между родителем и дочерним элементом. Свойство childs каждого экземпляра Parent - пустой список.

Я не знаю, что здесь не так. Почему отношения не будут сохраняться? Есть идеи?

Update

Я добавил интеграционный тест для ParentService, чтобы проверить наличие childs списка после создания всех Parent экземпляров:

... 
assert parentService.createParents(["123","234","356"]) == true 
def parent = Parent.get(1) 
assert parent.childs.size() > 0 
... 

Неожиданным - тест пройден.

+0

Можете ли вы подтвердить, что Grails удалось правильно создать родительские, дочерние и родительские таблицы – uchamp

+0

Да - все таблицы созданы правильно. Стол _parent_-table и _child_-table будут заполнены. Просто таблица соединений _parent_child_ пуста ... – aiolos

+0

Каковы транзакционные свойства вашего ParentService и someOtherService? Вы пытались сохранить/сбросить родительский экземпляр до вызова другой службы (и добавления детей)? – codelark

ответ

0

Я нашел происхождение ошибки.

Я полностью пропустил, что некоторые entry.value являются null. Не знаю, почему я не видел его во время отладки.

Теперь я использую только Child.findOrSaveWhere(), если entry.value не является null.

Я бы ожидал, что весь parentInstance.save() пройдет или не будет полностью. По-прежнему не понимаю, почему таблица соединений не будет заполняться без каких-либо ошибок.

+0

Добавление аргумента 'failOnError: true' для' save() 'может привести к такому поведению. –