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

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

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

问题是…

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

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

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

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

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

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

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

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

    Interesting Posts