Ленивая инициализация или Lazy Initialization в Hibernate

max аватар
126
Находится в разделах:

Предположим, что у нас есть метод для получения объекта книги по заданному ID.  Для него мы задали маппинг <many-to-one>, поэтому объект издателя, связанный с ним, должен быть также получен. 

Но когда мы пытаемся получить доступ к объекту издателя через book.getPublisher() извне метода, кидается исключение.

Если мы создадим код доступа внутри try-блока в теле метода, все ок. Тогда каков смысл исключения? Это все из-за того, что Hibernate не загрузит наш объект издателя из базы данных при первом доступе. В Hibernate  это называется "lazy initialization",  что может помочь избежать ненужных запросов к базе данных и тем самым повысив производительность.  Поскольку издатель был впервые затронут снаружи сессии (которая была закрыта), породилось исключение.

Если мы хотим, чтобы был доступ к объекту издателя вне сессии, есть два возможных решения проблемы. Первое - инициализировать издателя явно, вызовом метода Hibernate.initialize(). Этот код принудит загрузку объекта из базы.

Второй вариант - выключить ленивую загрузку для этой ассоциации. Это может снизить производительность, поскольку объект издателя будет загружаться вместе с объектом книги каждый раз.


Конец
Рене Декарт предполагает, что люди с сильным и великодушным характером не меняют своего настроения в зависимости от своего благополучия или своих несчастий.

 

Ленивый человек в беспечном покое сходен с неподвижною болотною водою, которая кроме смраду и презренных гадин ничего не производит.

Единственный способ что-то узнать — это что-то делать.

Люди с сильным и великодушным характером не меняют своего настроения в зависимости от своего благополучия или своих несчастий.

Отправить комментарий

CAPTCHA
Чтобы оставить комментарий, введите пожалуйста код, изображенный на картинке
Image CAPTCHA
Введите символы, изображенные на картинке