合并两个域对象,并在Grails中将子项重新分配给其中一个

时间:2011-05-31 20:35:16

标签: grails groovy merge gorm

我想要合并的域实体中有两个条目。我们打电话给父母的房子和孩子们的房间。我有一种情况,我想合并两个实际上相同的House域。我有逻辑做这个顶级合并。

但是,我想知道Grails中是否有一种方法可以轻松地说“通过域对象以及有指向House的fk指针的地方,将fk更新为新值”。

代码将是这样的

houseInst1.magicMerge(houseInst2)

这将运行House合并以及检查每个具有指针(fk)到House的域对象,并更新它指向houseInst2最初指向houseInst1的位置。

更新:一个关键功能是,如果有人添加另一个带有指向主对象的链接的域对象,我希望这样做。例如。如果有人后来添加了抵押贷款,我不想更新我的所有合并逻辑,它应该去找抵押贷款是House的孩子,并相应更新。

2 个答案:

答案 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关系。