每本书都可以有很多作者。每个作者都可以创作很多书。
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)。有人知道它是如何工作的,当它正在做急切的提取时?
答案 0 :(得分:1)
无论是热切还是懒惰加载,一旦加载了Hibernate托管的实例,它就会保存在Hibernate Session中,这是它的第一级缓存(如果你还配置了二级缓存,那么实例也会在那里如果他们以前装过,可能会从那里来。)
所以加载了这本书,然后加载了它的作者集合(默认情况下为Set),每个作者的书已经在Session中了,所以不需要去数据库。
急切地加载映射集合使用初始ResultSet来获取顶级实例以及一个数据库查询中的子实例。懒惰加载集合只需要第二个数据库查询来填充集合,但它的好处是只在需要时加载集合。
答案 1 :(得分:1)
为了更加清晰,您可以参考Burt Beckwith在http://burtbeckwith.com/blog/?p=169撰写的博客,您也可以浏览博客中提供的演示文稿链接。