急切加载是否加载所有相关对象?

时间:2016-10-07 07:30:16

标签: java mysql hibernate spring-data-jpa

说我有3个实体

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

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

class Comment{
  int idComment;
  Story idStory;
}

如果我想在屏幕上显示所有用户并且所有这些对象都是热切地加载的,那么这意味着在加载每个用户时我首先会加载他所写的所有故事,并且在加载每个故事时我将会加载。将加载为其发布的所有评论等等?

或者它只是停止加载故事?

1 个答案:

答案 0 :(得分:0)

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;
}

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

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

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

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

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

然后,当我们尝试获取用户实体时,我们只会急切地获取故事实体,而不是继续尝试获取评论实体,因为它有一个偷懒。

在这种情况下,当我们尝试访问时,我们会获取评论实体。