【问题标题】:What is the difference between FETCH and LOAD for Entity graph of JPA?JPA的实体图的FETCH和LOAD有什么区别?
【发布时间】:2015-11-05 19:37:44
【问题描述】:

我是 JPA 的新手,我正在尝试使用实体图。 我意识到当我检索数据时,我需要指定我要使用的 EntityGraphType。

我阅读了 JPA2.1 规范,但我仍然不确定如何正确使用这两个选项...

问题是……

  • 如果我没有任何具体要求,我应该使用哪个选项?
  • 需要使用Fetch和Load的具体情况是什么?

【问题讨论】:

    标签: java jpa entitygraph


    【解决方案1】:

    我将首先回答你问题的第二部分。

    需要使用Fetch和Load的具体情况是什么?

    在 JPA 中加载实体有两种主要方式,eager 加载和 lazy 加载。在急切加载中,实体在其父实体加载时立即加载。在延迟加载中,只有在调用实体的实际 getter 时才会加载实体。高性能应用程序倾向于延迟加载,因为让最终用户等待整个表甚至一组表在应用程序启动时加载并不是很好。现在回答你的第二个问题。

    您通过在包含实体的文件中导入javax.persistence.fetchgraph 来指定FETCH 作为您的策略。在这种情况下,您的实体图中指定的所有属性都将被视为FetchType.EAGER,而所有指定的属性将被视为FetchType.LAZY。另一方面,如果您通过导入javax.persistence.loadgraphLOAD 指定为您的策略,那么实体图中指定的所有属性也是FetchType.EAGER,但如果实体未指定任何内容,则未指定的属性使用它们指定的类型或默认值。

    如果我没有任何特定要求,我应该使用哪个选项?

    话虽如此,您不太可能没有特定要求。至少,您需要让您的 Web 应用程序快速运行。出于这个原因,您可能应该默认使用延迟加载。使用FETCH 图表是一个不错的选择,因为它默认延迟加载except,在您认为应该急切加载属性的少数特殊情况下。

    【讨论】:

    • 感谢您回答问题!我可以理解我应该如何正确使用这些选项。我认为如果我使用 fetch 选项,我无法检索子类数据,但是如果我调用 getter 方法我仍然可以这样做,但是当我调用 getter 时将从数据库中检索数据,而不是加载父类。
    • 该链接已损坏。你有没有保存它,所以你可以在这里粘贴内容。 ++1 很好的答案
    猜你喜欢
    • 2016-10-22
    • 2014-08-05
    • 1970-01-01
    • 2010-10-31
    • 2013-06-30
    • 2014-07-26
    • 2017-04-12
    • 2020-01-13
    相关资源
    最近更新 更多