Почему @OneToMany не грузит коллекции в LAZY?
Изучаю для себя LAZY loading, думал, что коллекция должна быть NULL, пока ее явно не попросят загрузиться.
Вот пример с Restaurant Entity ( методы пропущены для краткости, оставил только toString)
public class Restaurant extends AbstractNamedEntity {
String address;
@OneToMany(mappedBy = "restaurant", cascade = CascadeType.ALL, orphanRemoval = true)
@JsonManagedReference
private List<Dish> dishes;
@OneToMany(mappedBy = "restaurant", cascade = CascadeType.ALL, orphanRemoval = true)
@JsonManagedReference
private List<Vote> votes;
@Override
public String toString() {
return "Restaurant{" +
"address='" + address + '\'' +
", dishes=" + dishes +
", votes=" + votes +
'}';
}
}
Сначала загружаю объект Vote, который в себе имеет ссылку на Restaurant и получаю его. Т.е.
Vote vote = voteRepository.getById(1);
Restaurant restaurant = Vote.getRestaurant();
System.out.println(restaurant);
И выходит такое
Restaurant{address='Эспланада, 2а', dishes=[Dish{price=80.0, dateAdded=2021-08-13 };, Dish{price=69.0, dateAdded=2021-08-13 };], votes=[ voteDate=2021-08-13, user=restaurant.entity.User@22}]}
Т.е. несмотря, что дефолтный fetch type у @OneToMany lazy, все коллекции загружены. Почему? Разве не смысл lazy в том, что они должны быть NULL, пока я не сделаю restaurant.getDishes() явно.
Ладно, допустим, что это особенность получения объекта, из другого объекта, который имеет ссылку на него. Но если написать напрямую
Restaurant restaurant = restaurantRepository.getById(1);
System.out.println(restaurant);
то результат не меняется. Все коллекции будут загружены при System.out.println(). Буду крайне благодарен тому, кто сможет доступно объяснить почему так.
P.S. результат не меняется, даже если fetchType указан явно.
Ответы (1 шт):
Потому что LAZY loading начинает подгружать сущности сразу как вы обратились к списку. А это вы делаете в методе toString()