我想要合并的域实体中有两个条目。我们打电话给父母的房子和孩子们的房间。我有一种情况,我想合并两个实际上相同的House域。我有逻辑做这个顶级合并。
但是,我想知道Grails中是否有一种方法可以轻松地说“通过域对象以及有指向House的fk指针的地方,将fk更新为新值”。
代码将是这样的
houseInst1.magicMerge(houseInst2)
这将运行House合并以及检查每个具有指针(fk)到House的域对象,并更新它指向houseInst2最初指向houseInst1的位置。
更新:一个关键功能是,如果有人添加另一个带有指向主对象的链接的域对象,我希望这样做。例如。如果有人后来添加了抵押贷款,我不想更新我的所有合并逻辑,它应该去找抵押贷款是House的孩子,并相应更新。
答案 0 :(得分:2)
Grails域对象公开了hibernate merge()
方法,但是它完全不同:它将一个(可能是分离的)对象合并回持久化上下文。
我不知道有任何内置功能来合并你描述的两个对象。我认为您需要手动更新外键,如Gregg的答案。更有效的更新方法是通过HQL,如下所示:
Room.executeUpdate('update Room set house = :newHouse where house = :oldHouse',
[newHouse: newHouse, oldHouse: oldHouse])
编辑:要自动更新所有关联,您可以查询Artefact:
def artefact = grailsApplication.getArtefact("Domain", "House")
artefact.associationMap.values().each { associationClass ->
associationClass.executeUpdate("update ${associationClass.simpleName} set house = :newHouse where house = :oldHouse",
[newHouse: newHouse, oldHouse: oldHouse])
}
答案 1 :(得分:1)
这样的事情怎么样?在你摆脱旧房子之前,你会想要这样做。
Room.findAllByHouse(oldHouse).each { room ->
room.house = newHouse
room.save()
}
我没试过这个,我假设House和Room之间有一个非常标准的OneToMany关系。