Ленивая выборка решает, загружать ли дочерние объекты при загрузке родительского объекта.
Вы должны сделать эту настройку соответствующим файлом отображения гибернации родительского класса.
Lazy = true
(означает не загружать ребенка)
По умолчанию отложенная загрузка дочерних объектов имеет значение true.
Это гарантирует, что дочерние объекты не загружаются, если они не были явно вызваны в приложении путем вызова метода getChild()
для parent. В этом случае hibernate выдает новый вызов базы данных для загрузки дочернего объекта, когда getChild()
вызывается фактически на родительском объекте.
Но в некоторых случаях вам нужно загружать дочерние объекты при загрузке родительского объекта.
Просто сделайте lazy = false, и hibernate загрузит дочерний элемент при загрузке parent из базы данных.
Пример:
Если у вас есть СТОЛ? EMPLOYEE отображается на объект Employee и содержит набор объектов Address.
Родительский класс: класс сотрудника,
Дочерний класс: Адрес класса
public class Employee {
private Set address = new HashSet(); // contains set of child Address objects
public Set getAddress () {
return address;
}
public void setAddresss(Set address) {
this. address = address;
}
}
В файле Employee.hbm.xml
<set name="address" inverse="true" cascade="delete" lazy="false">
<key column="a_id" />
<one-to-many class="beans Address"/>
</set>
В вышеуказанной конфигурации.
Если lazy="false"
: - при загрузке объекта Employee в это время также загружается дочерний объект Address и устанавливается метод setAddresss ().
Если вы вызываете employee.getAdress (), то загруженные данные возвращаются. Нет нового вызова базы данных.
Если lazy="true"
: - это конфигурация по умолчанию. Если вы не упомянули, то в спящем режиме считайте lazy = true.
при загрузке объекта Employee дочерний объект Adress того времени не загружается. Вам нужен дополнительный вызов в базу данных, чтобы получить адресные объекты.
Если вы наберете employee.getAdress()
, тогда запрос времени к базе данных сработает и вернет результаты. Свежий вызов базы данных.