Lazy vs Eager加载JPA

时间:2012-04-12 17:05:59

标签: jpa-2.0 loading lazy-evaluation eager

我正在努力让一些JPA工作。我有一个表有另一个表的外键。当我生成JPA实体时,我会对这些变量进行一对多的编辑...还需要做什么才能将所有表格放回到结果集中?如果我确实称呼它。这是我想要做的一个例子。

@OneToMany(mappedBy="resourceId")
private List<DistributionLink> distributionLinkCollection;

@OneToMany注释很漂亮......

我想要恢复所有值我需要调用调用此表的命名查询吗?

qLaunchArr = (QuickLaunch[])emf.createNamedQuery("QuickLaunch.getQuickLaunch").getResultList().toArray();

我是否会想到我还会得到一系列包含所有结果集的DistributionLinks? 现在我知道这与Eager Loading vs Lazy加载有关。究竟是什么,我不确定。我知道延迟加载只加载显式调用的@oneToMany属性(我认为)?我怎样才能收回我需要的所有收藏品。我是否需要遍历结果集并调用命名查询以使用命名查询获取所有结果集?

感谢。

1 个答案:

答案 0 :(得分:6)

当您选择延迟加载某些内容时,取决于您是否仍处于事务上下文中,当您使用getter获取子集合时,JPA应自动为您获取它。因此,如果数据离开具有获取父对象的实体管理器的会话Bean,则您将无法自动实例化延迟加载的集合。

如果您选择使用EAGER获取策略,该集合的每个实例都将被预先实例化,并且可以在任何地方使用。

一个很好的折衷方案,可以让你避免约束你的设计决定(但仍然允许你利用延迟加载来避免在每次获取这些记录时加载你不需要的东西)到只处理bean中的这些集合获取父实体将是当你事先知道你将需要该集合时,坚持你的查询:

JOIN FETCH distributionLinks