2013-02-26 83 views
2

在我目前的项目中,我无法坚持一对多的关系。 双方的关系将被保存 - 只是他们之间的链接丢失。不能坚持一对多的关系

我的两个域之间的一个一对多的关系是这样的:

class Parent { 
    String name 
    ... 

    static hasMany = [childs: Child] 

    Parent() {} 

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

class Child { 
    int code 
    String description  
} 

我创建一个ParentService内我Parent实例:

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实例已成功创建并保存。父母和孩子之间的联系缺失。每个Parent实例的childs属性是一个空列表。

我dont't知道什么是错在这里。 为什么关系不会持续?有任何想法吗?

更新

我已经添加了ParentService集成测试创建所有Parent实例后,测试childs名单的存在:

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

不料 - 测试通过。

+0

你能否证实的Grails能够正确地创建 – uchamp 2013-02-26 17:13:00

+0

是父母,孩子和parent_child表 - 正确创建的所有表。 _parent_表和_child_表将被填充。只是连接表_parent_child_为空... – aiolos 2013-02-26 20:20:37

+0

ParentService和someOtherService的事务属性是什么?您是否曾尝试在调用其他服务(并添加子项)之前保存/刷新父实例? – codelark 2013-03-05 23:03:01

回答

0

我找到了错误的来源。

我完全错过了一些entry.valuenull。不知道为什么我在调试过程中没有看到它。

现在我只使用Child.findOrSaveWhere()如果entry.value不是null

我本来期望整个parentInstance.save()会通过或完全失败。仍然不明白为什么连接表不会填充任何错误。

+0

将'failOnError:true'参数添加到'save()'可能会导致你的行为。 – 2013-03-11 19:42:16