【发布时间】:2017-08-11 09:38:06
【问题描述】:
考虑遵循简单的实体模型
class Order{
int id;
String description;
//one to one eager load with join column specified
Detail details;
//one to many lazy load with mapped by specified
Collection<Item> items;
}
class Detail{
}
class Item{
String name;
//reference to order
}
现在,假设要求是通过某些标准(例如,匹配的描述)加载所有带有商品详细信息的订单。很简单,我写了一个类似“来自描述...的订单”的 hql。例如,这会加载 1000 个实体,并且项目集合是延迟加载的。我通过调用 size 在会话中强制加载它们。
这当然导致了 N+1 问题,所以我决定对项目使用批量获取。刚刚在项目集合上添加了批量大小注释,并且预期的查询要少得多。
但是,我对“详细信息”根本不感兴趣,但由于它是一对一的急切加载,因此每个订单都有一个查询来始终加载它。我只是想取消这些查询。
为了解决这个问题,我尝试在没有详细信息的情况下进行选择,但我不确定如何在查询中包含项目(集合),以便以与我选择全部相同的方式加载它(即,延迟加载,然后可以在以后的调用中利用批处理大小)。一些建议是在 where 子句中使用 join ,但这会使用空数组列表初始化我的集合(而不是像延迟加载那样使用 PersistentBag)。
寻找解决方案。
【问题讨论】:
-
为什么不让
Detail懒加载? -
应用程序的其他部分依赖于默认(急切)加载。此外,使 1-1 成为延迟加载的所有解决方案都非常重要(字节码检测等),我不想冒险破坏现有代码。
标签: java hibernate jpa lazy-loading