在JPA中使用Eager Fetch的时机是什么?

时间:2015-01-22 16:00:43

标签: java hibernate java-ee jpa ejb

我发现在eager fetchlazy 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 FetchLazy fetch之间以及内存成本(来自eager fetch)和数据库交易成本(来自lazy fetch)之间的选择是什么? ),这是赢家?

1 个答案:

答案 0 :(得分:0)

EAGER抓取是code smell。如果通过EntityMangager加载实体,则使用JOIN。如果您通过JPQL / Criteria API加载它们,则会使用辅助选择。

最好将所有关联设置为LAZY并改为使用JOIN FETCH。提取策略是一种查询时间责任,永远不应该委托给实体映射。

全局获取计划是一个坏主意,尤其是因为它无法适应所有应用程序查询方案。

因此,您可以安全地使用LAZY和查询时JOIN FETCH加载。