【发布时间】:2012-11-29 13:49:21
【问题描述】:
我找到了解决我遇到的问题的方法,我想知道它是否有效。这是一个类似的问题:Grails Gorm : Object references an unsaved transient instance
假设我有两个域对象(更改名称以保护有罪者)。
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 必须确认其他 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 魔法工作。并且可能在此过程中破坏了某些东西。
建议?解释?
【问题讨论】:
-
你已经测试过
Book book4 = new Book(title:"Awesome Title 4", shelf: existingShelf)的性能了吗?
标签: database grails grails-orm