gpt4 book ai didi

database - Grails/GORM 域保存 - 临时对象解决方法

转载 作者:搜寻专家 更新时间:2023-10-30 19:41:42 25 4
gpt4 key购买 nike

我找到了解决我遇到的问题的方法,我想知道它是否有效。这是一个类似的问题: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 个 Shelf 包含 0 到多本书,而一本书只能放在一个 Shelf 上。

这个架子很大。在某些时候,它包含 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)

这给了我一个“对象引用一个未保存的 transient 实例”,我想这是有道理的——“架子”值为空。

所以我做了一些奇怪的事情:

  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()

会更快,并且在技术上没有任何问题。请注意,在您从数据库中刷新集合之前,您的 grailsS​​helf.books 实例不会包含新书。这是 addTo* 方法为您完成的部分工作。

旁注:

Set<Book> books = [] as Set

没有必要。

关于database - Grails/GORM 域保存 - 临时对象解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13627243/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com