[英]Is it possible to map a table name for a domain object dynamically in grails?
[英]Grails/GORM domain saving - transient object workaround
我找到了解決問題的方法,我想知道它是否有效。 這是一個類似的問題: Grails Gorm:Object引用一個未保存的瞬態實例
讓我們假設我有兩個域對象(名稱已更改以保護有罪)。
public class Shelf {
String name
Set<Book> books = [] as Set
static hasMany = [books: Book]
}
和
public class Book {
String title
Shelf shelf
}
所以這意味着1個書架包含0到多本書,而一本書只能在一個書架上。
這個架子非常大。 在某些時候,它包含80,000本書。 全部存儲在DB中。 當然,添加新書變得越來越慢。
這是通過:
Book book1 = new Book("Awesome Title")
existingShelf.addToBooks(book1)
existingShelf.save(flush: true) // super slow
這很慢。 主要是(我假設),因為GORM必須確認其他80,000條記錄。
所以我這樣做試圖解決慢點問題。
Book book2 = new Book("Awesome Title 2")
book2.save(flush: true)
這給了我一個“對象引用一個未保存的瞬態實例”,我認為這是有道理的 - “架子”值是空的。
所以我做了一些有點奇怪的事情:
Book book3 = new Book("Awesome Title 3")
book3.shelf = new Shelf()
book3.shelf.id = <known/valid id here>
book2.save(flush: true)
這有效。 它節省了。 沒有參考錯誤。 依賴於此的進一步代碼......有效。 我剛剛撥打電話,持續了幾分鍾,並將其縮短為秒。 但這似乎太容易了。 我敢肯定我是如何在Grails魔術周圍工作的。 並且可能在此過程中破壞了一些東西
建議嗎? 解釋嗎?
是的,使用addTo *方法可能會很慢。 如果你看一下生成的SQL,你就會明白為什么。 執行以下操作:
new Book(title: "GORM Performance", shelf: grailsShelf).save()
會更快,技術上沒有任何問題。 請注意,在您從數據庫刷新集合之前,您的grailsShelf.books實例不會包含新書。 這是addTo *方法為您所做的一部分。
邊注:
Set<Book> books = [] as Set
沒必要。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.