我找到了解決問題的方法,並且我想知道它是否有效。這是一個類似的問題:Grails Gorm : Object references an unsaved transient instance保存Grails/GORM域名 - 瞬態對象解決方法
讓我們假設我有兩個域對象(名稱更改爲保護有罪)。
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本書。所有存儲在數據庫中很好。當然,添加新書越來越慢。
這是通過:
Book book1 = new Book("Awesome Title")
existingShelf.addToBooks(book1)
existingShelf.save(flush: true) // super slow
這是緩慢的。主要(我假設)是因爲GORM必須確認其他8萬條記錄。
所以我這樣做是爲了解決這個問題。
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的魔術中工作過一些。可能在這個過程中破壞了一些東西。
建議?解釋嗎?
您是否已經測試過'Book book4 = new Book(標題:「Awesome Title 4」,shelf:existingShelf)的性能? – rdmueller