不能保持一对多的关系

时间:2013-02-26 15:35:03

标签: grails gorm

在我目前的项目中,我无法坚持一对多的关系。 关系的双方都将被保存 - 只是它们之间的联系缺失。

我的两个域之间的一对多关系如下所示:

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属性都是一个空列表。

我不知道这里有什么问题。 为什么这种关系不会被持久化?有什么想法吗?

更新

我为ParentService添加了一个集成测试,以便在创建所有childs个实例后测试Parent列表是否存在:

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

出乎意料 - 测试通过了。

1 个答案:

答案 0 :(得分:0)

我找到了错误的起源。

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

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

我原本期望整个parentInstance.save()完全通过或失败。仍然不明白为什么在没有给出任何错误的情况下不会填充连接表。