Что содержит объект прокси-сервера Hibernate?

Все, что я мог собрать из Google, это то, что:

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

  • Hibernate создает прокси-объект с использованием инструментария байт-кода (предоставляется javassist). Hibernate создает подкласс нашего класса сущности во время выполнения с использованием библиотеки генерации кода и заменяет фактический объект вновь созданным прокси.

Итак, что именно содержит объект Proxy?

Имеет ли он ссылочный объект объекта скелета только с установленным полем идентификатора? Другое поле будет установлено, когда мы вызываем метод get?

Объект Proxy содержит оператор JDBC для извлечения всех данных, необходимых для полного заполнения ссылочного объекта.

Есть ли что-то еще, что я могу потерять?

Я не прошу кормить ложкой, но если вы можете предоставить любую ссылку с информацией, которая была бы большой.

Также будет приветствоваться любая коррекция вышеприведенного описания.

Пример.

class Address {
   String city;
   String country;
}

class Person{
   int id;
   String name;
   Address address;
}    

Когда мы пытаемся загрузить объект Person, Hibernate будет подклассифицировать класс Person следующим образом:

class ProxyPerson extends Person {
       int id;
       String name;
       Address proxyCGLIBObject;
}

и вернуть объект ProxyPerson. Объект ProxyPerson будет иметь значение для id и имени, но прокси для адреса.

Правильно ли я?

Что я могу ожидать от добавления метода toString() в прокси-объекте?

Ответ 1

Как объясняется в моей книге Высокая производительность Java Persistence, прокси-сервер Hibernate используется по следующим причинам:

  • Чтобы скрыть инициализацию инициализации lay .

  • Класс Proxy генерируется во время выполнения и расширяет исходный класс сущности.

  • Для базовых свойств он просто делегирует вызов исходной сущности.

  • Каждый тип List, Set, Map заменяется PersistentList, PersistentSet, PersistentMap. Эти классы отвечают за перехват вызова неинициализированной коллекции.

  • Прокси не выдает никаких операторов SQL. Он просто запускает InitializeCollectionEvent, который обрабатывается связанным с ним слушателем, который знает, какой запрос инициализации должен быть задан (зависит от настроенного плана выборки).