渴望加载多对多关系 - Grails(GORM)

时间:2009-09-02 00:35:58

标签: grails gorm eager-loading

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

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)。有人知道它是如何工作的,当它正在做急切的提取时?

2 个答案:

答案 0 :(得分:1)

无论是热切还是懒惰加载,一旦加载了Hibernate托管的实例,它就会保存在Hibernate Session中,这是它的第一级缓存(如果你还配置了二级缓存,那么实例也会在那里如果他们以前装过,可能会从那里来。)

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

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

答案 1 :(得分:1)

为了更加清晰,您可以参考Burt Beckwith在http://burtbeckwith.com/blog/?p=169撰写的博客,您也可以浏览博客中提供的演示文稿链接。