2

每本书可以有很多作者。每个作者都可以写很多本书。

class Book {
   static belongsTo = Author
   static hasMany = [authors:Author]
}

class Author {
   static hasMany = [books:Book]
}

现在我什么时候可以做:

def book = Book.get(id)
def authors = book.authors

现在我想我应该能够带走每个作者并获得与他相关的书籍:

authors.each {
   it.books
}

你现在看到它会递归(导致stackoverflow)。有谁知道它是如何工作的,当它进行急切的获取时?

4

2 回答 2

1

无论是急切加载还是延迟加载,一旦加载了 Hibernate 管理的实例,它就会保存在 Hibernate Session 中,这是它的一级缓存(如果您还配置了二级缓存,那么实例也将在那里并且可能有如果它们之前已加载,则从那里来)。

所以加载了这本书,然后加载了它的作者集合(默认为一个 Set),每个作者的书已经在 Session 中,所以不需要去数据库。

急切地加载映射集合使用初始 ResultSet 来获取顶级实例以及一个数据库查询中的子实例。延迟加载集合只需要第二个数据库查询来填充集合,但它的好处是仅在需要时才加载集合。

于 2009-09-02T02:27:23.700 回答
1

为了更清楚,您可以参考 Burt Beckwith 在http://burtbeckwith.com/blog/?p=169上撰写的博客,您也可以通过博客中给出的演示链接。

于 2009-09-02T04:09:12.733 回答