【问题标题】:Does eager loading load all related objects?急切加载是否会加载所有相关对象?
【发布时间】:2024-05-19 11:50:01
【问题描述】:

假设我有 3 个实体

class User{
  int idUser;
  List<Story> stories;
}

class Story{
  int idStory;
  User idUser;
  List<Comment> comments;
}

class Comment{
  int idComment;
  Story idStory;
}

如果我想在屏幕上显示所有用户并且所有这些对象都急切加载,这是否意味着在加载每个用户时我将首先加载他编写的所有故事,在加载每个故事时我将加载所有 cmets为它张贴等等?

或者它会在加载故事时停止?

【问题讨论】:

  • 如果您在故事实体/命名查询中进行了这样的设置,则将加载 cmets。 :)

标签: java mysql hibernate spring-data-jpa


【解决方案1】:

Hibernate 将完全按照您的定义进行获取。

让我们这么说:

class User{
  int idUser;
  @OneToMany(fetch = FetchType.EAGER)
  List<Story> stories;
}

class Story{
  int idStory;
  User idUser;
  @OneToMany(fetch = FetchType.EAGER)
  List<Comment> comments;
}

因此,当我们尝试加载 User 实体时,我们还将获取所有相关的 Story 实体,因为 User 类上的关联设置为急切地获取。

此外,虽然 hibernate 将获取 Story 实体(因为前面提到过),但我们还将再次获取所有相关的 Comment 实体,因为 Story 类上的关联设置为热切地获取。

这将在尝试加载单个用户时执行。

但是,如果我们没有定义:

class Story{
  int idStory;
  User idUser;
  @OneToMany(fetch = FetchType.Lazy)
  List<Comment> comments;
}

那么当我们尝试获取 User 实体时,我们只会急切地获取 Story 实体,不会继续尝试获取 Comment 实体,因为它有一个惰性获取。

在这种情况下,我们将在尝试访问 Comment 实体时获取它。

【讨论】:

    最近更新 更多