在我目前的项目中,我无法坚持一对多的关系。 关系的双方都将被保存 - 只是它们之间的联系缺失。
我的两个域之间的一对多关系如下所示:
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
...
出乎意料 - 测试通过了。
答案 0 :(得分:0)
我找到了错误的起源。
我完全错过了一些entry.value
null
。不知道为什么我在调试过程中没有看到它。
现在,如果Child.findOrSaveWhere()
不是entry.value
,我只会使用null
。
我原本期望整个parentInstance.save()
完全通过或失败。仍然不明白为什么在没有给出任何错误的情况下不会填充连接表。