Как ленивая загрузка работает для сбора объектов? - PullRequest
0 голосов
/ 29 февраля 2020

У меня есть связь «один ко многим», а FetchType LAZY.
Я знаю, что hibernate создаст прокси-объект для лениво загруженной сущности. Но как это работает, если дочерняя сущность имеет тип Collection? Будет ли он создавать прокси для каждого объекта коллекции?
Пример: -

 public class Company {
    private String name;    

    @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY)
    private Set<Employee> employees;
 } 

1 Ответ

1 голос
/ 29 февраля 2020

Прокси создан для поля, это означает, что employees будет прокси над коллекцией. Теперь, если вы попытаетесь перебрать элементы коллекции, в основном есть две возможности:

  1. Если вы не в транзакции, будет выброшено LazyInitializationException. Это хорошо, потому что вы знаете, что вам нужно их с нетерпением извлекать из этого запроса.
  2. Если вы находитесь в транзакции, то hibernate будет извлекать каждый элемент, который вы перебираете. Это огромные потери производительности, потому что вам нужно запустить запрос для выборки родительского объекта, а затем один запрос для каждого дочернего элемента. Если есть N детей, вам нужно сделать N+1 звонков в базу данных, это также называется N + 1 проблема выбора .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...