簡體   English   中英

在 Grails 中合並兩個域對象並將子對象重新分配給其中一個

[英]merge two domain objects and reassign children to one of them in Grails

我在要合並的域實體中有兩個條目。 讓我們稱父母之家和孩子之家。 我有一種情況,我想合並兩個實際上相同的 House 域。 我有邏輯來做這個頂級合並。

但是,我想知道 Grails 中是否有一種方法可以輕松地說“遍歷域對象以及任何指向 House 的 fk 指針,將該 fk 更新為新值”。

代碼將是這樣的

houseInst1.magicMerge(houseInst2)

這將運行 House 合並,並檢查具有指向 House 的指針 (fk) 的每個域 object 並更新它最初指向 houseInst2 的位置以指向 houseInst1。

更新:一個關鍵特性是,如果有人添加另一個域 object 並帶有指向主 object 的鏈接,我希望它能夠工作。 例如。 如果后來有人添加了 Mortgages,我不想更新我所有的合並邏輯,它應該 go 並發現 Mortgages 是 House 的孩子,並相應地更新。

Grails 域對象公開了 hibernate merge()方法,但這完全不同:它將(可能分離的)object 合並回持久性上下文中。

我不知道有任何內置功能可以像您描述的那樣合並兩個對象。 我認為您需要像 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])
}

這樣的事情怎么樣? 在你擺脫舊房子之前,你會想要這樣做。

Room.findAllByHouse(oldHouse).each { room ->
    room.house = newHouse
    room.save()
}

我還沒有嘗試過,我假設 House 和 Room 之間存在相當標准的 OneToMany 關系。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM