2017-01-04 6 views
0

Допустим у меня есть связь, как,принести ли FetchType.LAZY ничего в списке, или это пустая

class Department{ 

...... 

@OneToMany(fetch = FetchType.LAZY) 
private List<Employee> employees; 

} 

Теперь, когда я принести Department, он будет получать ничего в employees list или это будет совершенно пустой.

ли идентификаторы объекта сотрудника будут загружены в список, как говорят, у меня есть объект работника атрибуты, как показано ниже: -

Employee{ 
id 
name 
doj 
.... 

} 

Lazy object like { 
id -> 111 
name -> null 
doj -> null 

} 

Теперь, когда я инициализировать объект работника или доступ к его свойства с помощью методов получения, то объект будет загружен из базы данных с использованием id в качестве идентификатора ... ??

+0

Вы можете попробовать и посмотреть. –

ответ

0

В вашем случае, пока вы явно не получите доступ к Department.employees (через геттер или любые другие средства) Он не загрузит объекты Employee. Для этого будет прокси. Он будет инициализирован один раз при первом вызове для доступа к этой коллекции employees.

+0

будет содержать первичный ключ или любой идентификатор. –

0

Как Ленивый Загрузка Работает в Hibernate

Самый простой способ, что Hibernate может применить ленивые поведение нагрузки на ваших организаций и объединений, обеспечивая реализацию прокси из них. Hibernate перехватывает вызовы сущности путем подстановки прокси-сервера для него, полученного из класса сущности. Если запрашиваемая информация отсутствует, она будет загружена из базы данных до того, как управление будет передано в реализацию родительского объекта.

Обратите внимание: когда ассоциация представляется в виде класса коллекции, тогда создается и заменяется исходная коллекция (по существу, прокси для коллекции, а не для сущностей, которые она содержит). Когда вы получаете доступ к этому прокси-серверу, то то, что вы получаете внутри возвращенной коллекции прокси, не является прокси-объектами; скорее они являются реальными сущностями. Вам не нужно оказывать сильное давление на понимание этой концепции, потому что во время выполнения это не имеет большого значения.

Пожалуйста, обратитесь это для получения дополнительной информации: http://howtodoinjava.com/hibernate/lazy-loading-in-hibernate/

Также включите hibernate.sql.show=true, так что вы можете видеть, какие запросы увольняют, когда вы пытаетесь принести коллекции.

2

Вместо реального класса коллекции (например, ArrayList) в ваше поле вводится другая реализация (PersistentList). В зависимости от вызовов на этой коллекции и ленивой стратегии он будет делать разные вещи:

  • В случае lazy="lazy" вызов любого из методов коллекции получили бы коллекцию полностью нагруженный
  • Если lazy="extra", а затем вызывает в некоторых функции будут запускать SQL без загрузки коллекции. Например. list.size() будет вызывать select count.... При получении первого элемента будет выбран только этот элемент. Это может быть удобно для больших коллекций. Обратите внимание, что это поведение также может зависеть от типа коллекции - неупорядоченные коллекции будут загружать все элементы в любом случае.
1

Lazy fetch type, Hibernate не будет загружать отношения для этого экземпляра конкретного объекта.

FetchType.LAZY = Не загружает отношения, если явно «просили» через добытчик FetchType.EAGER = загружает все отношения

В вашем случае это не будет загружать список сотрудника из базы данных, если вы явно не срабатывали запрос для него, Поскольку вы установили тип выборки (fetch = FetchType.LAZY). Если тип выборки был (fetch = FetchType.EAGER), то он явно запускает запрос выбора для списка Employee. В этом объекте вы получите все свойства employee, например name, doj.

объект будет загружен из базы данных, используя идентификатор в качестве идентификатора ... ??

Department{ 
    @OneToMany(fetch = FetchType.EAGER,,mappedBy = "department") 
    private List<Employee> employees; 
} 

В Emplooyee .... Вам нужно замэпили по ссылке объекта отдела. например:

Employee{ 

    // Reference of department. 

    @ManyToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "departmentid", nullable = false) 
    private Department department; 
} 

Таким образом, он станет двунаправленной. теперь Hibernate будет запускать запрос по ссылке (id в native sql).

Если вы хотите быть загружен лениво множество Fetch режим FetchType.LAZY в обоих отображения ....

+0

* FetchType.LAZY = Не загружает отношения, если явно не «запрошено» через ** getters ***: я считаю, что это неправильно. Всякий раз, когда вы получаете доступ к списку (через большинство его методов), он запускает ленивую загрузку. Это не имеет никакого отношения к «getters» –

+0

И вам не нужно отображать его так же, как хотелось бы для двунаправленных отношений. –

+0

да, я согласен, я просто привел пример, если вы хотите загрузиться, тогда вам нужно написать, например: @OneToMany (fetch = FetchType.EAGER ,, mappedBy = "department") здесь. иначе он ничего не загрузит. Ваш набор будет пустым. – Gokul