我发现在eager fetch
和lazy fetch
之间进行选择非常棘手。众所周知,eager fetch
可以在会话完成后保留数据,lazy fetch
更像是按需获取数据并在事务完成后过期,感觉就像eager fetch
花费更多资源,有时还会检索不必要的数据。
例如,如果购物车中有100个订单,并且每个订单包含多个"项目"(因此存在两个级别的关系),我们在eager fetch
中设置这些关系,即使只是我们想要检索特定的购物车属性:
// JPA will run many queries for the expire timestamp
// if set all relation in ShoppingCart to Eager fetch...
Date expire = ShoppingCart.find(id).getExpireTimestamp();
它仍然会提取所有订单和所有项目(通过额外查询),这是一个巨大的浪费。
但是,另一方面,我发现lazy fetch
可能不会更快,因为延迟提取需要一个事务来运行select * from .. fetch join..
所以我的问题是,Eager Fetch
和Lazy fetch
之间以及内存成本(来自eager fetch
)和数据库交易成本(来自lazy fetch
)之间的选择是什么? ),这是赢家?
答案 0 :(得分:0)
EAGER抓取是code smell。如果通过EntityMangager加载实体,则使用JOIN。如果您通过JPQL / Criteria API加载它们,则会使用辅助选择。
最好将所有关联设置为LAZY并改为使用JOIN FETCH。提取策略是一种查询时间责任,永远不应该委托给实体映射。
全局获取计划是一个坏主意,尤其是因为它无法适应所有应用程序查询方案。
因此,您可以安全地使用LAZY和查询时JOIN FETCH加载。