【问题标题】:Lazy vs Eager loading with JPA使用 JPA 进行延迟加载与急切加载
【发布时间】:2012-04-12 17:05:58
【问题描述】:

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

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

@OneToMany 注释很漂亮...

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

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

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

谢谢。

【问题讨论】:

    标签: jpa-2.0 loading lazy-evaluation eager


    【解决方案1】:

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

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

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

    JOIN FETCH distributionLinks
    

    【讨论】:

    猜你喜欢
    • 2015-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多