繁体   English   中英

Grails / GORM域保存 - 瞬态对象变通方法

[英]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()

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

边注:

Set<Book> books = [] as Set

没必要。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM