JPA实体图的FETCH和LOAD有什么区别?

What is the difference between FETCH and LOAD for Entity graph of JPA?

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

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

问题是……

我将从回答你问题的第二部分开始。

what is the specific situation when I need to use Fetch and Load?

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

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

which option should I use if I don't have any specific reqirement?

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