JPA 的实体图的 FETCH 和 LOAD 有什么区别?
2022-09-01 02:35:40
我是JPA的新手,我正在尝试使用实体图。我意识到当我检索数据时,我需要指定要使用的EntityGraphType。
我阅读了JPA2.1规范,但我仍然不确定如何正确使用这2个选项...
问题是...
- 如果我没有任何特定要求,我应该使用哪个选项?
- 当我需要使用提取和加载时,具体情况是什么?
我是JPA的新手,我正在尝试使用实体图。我意识到当我检索数据时,我需要指定要使用的EntityGraphType。
我阅读了JPA2.1规范,但我仍然不确定如何正确使用这2个选项...
问题是...
我将首先回答你问题的第二部分。
当我需要使用提取和加载时,具体情况是什么?
在 JPA 中加载实体有两种主要方法:预先加载和延迟加载。在预先加载中,在加载实体的父级时立即加载实体。在延迟加载中,仅当调用实体的实际 getter 时,才会加载该实体。高性能应用程序往往偏向于延迟加载,因为让最终用户在应用程序启动时等待整个表甚至一组表加载并不是很好。现在进入你的第二个问题。
您可以通过导入包含实体的文件来指定为策略。在这种情况下,实体图中指定的所有属性将被视为 ,所有未指定的属性将被视为 。另一方面,如果您通过导入来指定策略,则实体图中指定的所有属性也是,但未指定的属性使用其指定的类型,如果实体未指定任何内容,则使用默认值。FETCH
javax.persistence.fetchgraph
FetchType.EAGER
FetchType.LAZY
LOAD
javax.persistence.loadgraph
FetchType.EAGER
如果我没有任何特定要求,我应该使用哪个选项?
话虽如此,您不太可能没有特定的要求。至少,您需要 Web 应用程序快速运行。因此,您可能应该默认为延迟加载。使用图形是一个不错的选择,因为它默认为延迟加载,除非在少数特殊情况下,您认为应该预先加载属性。FETCH