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

Nag*_*aga 25 java jpa entitygraph

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

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

问题是...

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

Tim*_*sen 38

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

当我需要使用Fetch和Load时,具体情况是什么?

在JPA中加载实体有两种主要方法,即预先加载和延迟加载.在急切加载时,实体在其父加载时立即加载.在延迟加载中,仅在调用该实体的实际getter时才加载实体.高性能应用程序往往偏向于延迟加载,因为在应用程序启动时使最终用户等待整个表,甚至是一组表加载都不是很好.现在谈谈你的第二个问题.

FETCH可以通过导入javax.persistence.fetchgraph包含实体的文件来指定策略.在这种情况下,实体图中指定的所有属性都将被视为FetchType.EAGER,并且指定的所有属性都将被视为FetchType.LAZY.另一方面,如果LOAD通过导入指定策略,javax.persistence.loadgraph则实体图中指定的所有属性也是,FetchType.EAGER但未指定的属性使用其指定的类型,如果实体未指定任何属性,则使用默认值.

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

话虽这么说,你不太可能没有特定的要求.至少,您需要Web应用程序快速运行.因此,您可能应该默认为延迟加载.使用FETCH图形是一个很好的选择,因为它默认为延迟加载,除非在您认为应该急切加载属性的少数特殊情况下.

这是一个很棒的博客链接,它详细解释了所有这些,以及代码示例.