4

我正在尝试让一些 JPA 工作。我有一个表,它有另一个表的外键。当我生成 JPA 实体时,我会在这些变量上获得一对多的注释......我还需要做什么才能让所有表回到结果集中?如果我确实调用它。这是我正在尝试做的一个例子。

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

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

我正在考虑取回所有值,我只需要调用调用此表的命名查询吗?

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

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

谢谢。

4

1 回答 1

6

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

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

一个很好的折衷方案,可以让您避免限制您的设计决策(但仍然允许您利用延迟加载来避免在每次获取这些记录时加载您不需要的内容)以仅处理获取这些记录的 bean 中的这些集合父实体将是当您提前知道您将需要该集合时,坚持您的查询:

JOIN FETCH distributionLinks
于 2012-04-12T17:35:53.410 回答