是否有任何使用Hibernate的额外延迟加载可能会有危险的情况?
文件说: “Extra-lazy”集合提取:根据需要从数据库中访问集合的各个元素。除非绝对需要,否则Hibernate会尝试不将整个集合提取到内存中。它适用于大型系列。
我不确定我是否明白这一点的含义 - 这是否意味着如果我声明所有关联都是懒惰的,无论其大小如何,我都会失去性能?是否有一些关于使用额外延迟加载的经验法则?
答案 0 :(得分:4)
这是一个常见的N + 1问题,What is SELECT N+1?,成倍增加。至于表现,很难说:很可能,你会失去表现。但也许不是。
问题是,如果你尝试迭代一个超级惰性集合,你将获得数据库的N + 1查询:一个用于整个集合,每个实体一个。它可能会也可能不会好,具体取决于缓存和数据的性质。
更新:常识建议编码最简单的工作(即默认设置),然后在实际使用场景下进行分析,并在获得数据后确定实际方法。
预先坚持一个特定的解决方案没有任何意义。如果你只需要一个来自集合的元素,那么超懒的检索就会获胜。也许。如果您需要整个集合,则延迟检索会影响性能。也就是说,如果您没有缓存整个域,在这种情况下您不关心。一般
从Criteria API和显式声明开始,它有点破坏了Hibernate的目标:你希望你的业务层不关心(只要合理可行)关于映射细节。因此,只要您可以在映射中保留映射设置,最好这样做。一如既往,YMMV。