在我当前的项目中,我无法保持一对多关系。
关系的双方将被保存-只是它们之间的链接丢失了。
我的两个域之间的一对多关系如下所示:
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
实例均已成功创建并保存。只是 parent 与 child 之间的联系缺失了。每个childs
实例的Parent
属性是一个空列表。我不知道这是怎么回事。
为什么这种关系不会持久?有任何想法吗?
更新
在创建所有
ParentService
实例之后,我为childs
添加了集成测试,以测试Parent
列表的存在:...
assert parentService.createParents(["123","234","356"]) == true
def parent = Parent.get(1)
assert parent.childs.size() > 0
...
没想到-测试通过了。
最佳答案
我找到了错误的根源。
我完全错过了一些entry.value
是null
。不知道为什么我在调试期间没有看到它。
现在,如果Child.findOrSaveWhere()
不是entry.value
,我仅使用null
。
我希望整个parentInstance.save()
完全通过或失败。仍然不明白为什么在不给出任何错误的情况下无法填充联接表。
关于grails - 无法保持一对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15093091/