Подтвердить что ты не робот

Что такое прокси-сервер в контексте метода load() Hibernate?

Документация Hibernate для метода load() гласит:

Имейте в виду, что load() сгенерирует неисправимое исключение, если нет соответствующей строки в базе данных. Если класс сопоставлен с прокси, load() просто возвращает неинициализированный прокси и фактически не обращается к базе данных, пока вы не вызовете метод прокси. Это полезно, если вы хотите создать ассоциацию с объектом без фактической загрузки его из базы данных. Это также позволяет загружать несколько экземпляров как пакет, если размер пакета определен для отображения класса.

Пожалуйста, помогите мне понять это, объяснив значение выделенных выше частей жирным шрифтом.

4b9b3361

Ответ 1

Прокси - это классы, динамически генерируемые Hibernate для обеспечения ленивой загрузки. Например, если у вас есть класс Cat, Hibernate будет генерировать прокси-класс, который расширяет Cat.

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

Теперь предположим, что ваш класс Cat не является прокси-сервером и что он имеет ассоциацию father, когда вы загружаете объект Cat, Hibernate должен будет загрузить все его атрибуты. Поэтому, если вы загружаете объект Cat, Hibernate также должен будет загрузить своего отца и отца-отца и так далее. Использование прокси позволяет Hibernate загружать только нужные экземпляры.

Cat cat1 = (Cat) session.load(1);
Cat cat2 = (Cat) session.load(2);
Cat cat3 = (Cat) session.load(3);

cat1.meow(); // this will cause Hibernate to run a query to load cat1 data
cat2.meow(); // this will cause Hibernate to run a query to load cat2 data

// After this cat3 is still an uninitiated proxy because it has not been used

batch-size - еще одна особенность Hibernate, которая в большинстве случаев помогает справляться с ленивой загрузкой. В основном идея заключается в том, что Hibernate отслеживает неинициализированные прокси, и когда один из них нужно инициализировать, будет выполнен один запрос для загрузки до batch-size прокси (вместо одного прокси-запроса)

Cat cat1 = (Cat) session.load(1);
Cat cat2 = (Cat) session.load(2);

cat1.meow(); // if batch-size >= 2, cat1 and cat2 will be loaded in a single query
cat2.meow(); // no query will be executed here

Ответ 2

Это похоже на ленивую загрузку ассоциаций, но может рассматриваться как скорее "ленивое создание".

Прокси-сервер - это подкласс, реализованный во время выполнения. Hibernate создает прокси-сервер (подкласс выбранного класса) вместо прямого запроса базы данных, и этот прокси-сервер будет загружать "реальный" объект из базы данных всякий раз, когда вызывается один из его методов.

Во втором выделенном тексте объясняется, что если вы вызываете load() в нескольких экземплярах, вы можете получить их в виде пакета и тем самым уменьшить обратные вызовы в базу данных.

Это также разница между load() и get(), load sort lazy-load object, а сразу получает выборку из базы данных

Ответ 3

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