Hibernate 额外的懒惰危险吗?

asp*_*gus 4 hibernate

是否存在使用 Hibernate 的额外延迟加载可能很危险的场景?

文档说:“Extra-lazy”集合获取:根据需要从数据库访问集合的各个元素。除非绝对需要,否则 Hibernate 会尽量不将整个集合提取到内存中。它适用于大型收藏。

我不确定我是否理解这的含义 - 这是否意味着如果我声明所有关联都特别懒惰,无论它们的大小如何,我都会失去性能?关于额外延迟加载的使用是否有某种经验法则?

alf*_*alf 5

这是一个常见的 N+1 问题,什么是 SELECT N+1?,倍增。至于性能,很难说:很可能,你会失去性能。但也许不是。

问题是,如果您尝试迭代一个特别懒惰的集合,您将得到对数据库的 N+1 查询:一个用于整个集合,一个用于每个实体。它可能好也可能不好,这取决于缓存和数据的性质。

更新:常识建议编码最简单的东西(即默认设置),然后在实际使用场景下进行分析,并在获得数据后决定实际方法。

预先坚持一个特定的解决方案是没有意义的。如果您只需要集合中的一个元素,那么超懒检索将胜出。也许。如果你需要整个集合,额外的懒惰检索会影响性能。也就是说,如果您没有缓存整个域,在这种情况下您并不关心。通常。

至于 Criteria API 和显式声明,它在某种程度上破坏了 Hibernate 的目标:您希望您的业务层不关心(只要合理可行)映射细节。所以只要你可以在映射本身中保留映射设置,最好这样做。一如既往,YMMV。