2014-10-29 2 views
2

Я думал, что объектные прокси используются только тогда, когда класс имеет поле типа Collection, и использует Lazy fetching. Однако некоторые источники полагают, что Hibernate 3 использует прокси для всех объектов, независимо от того, имеет ли объект поле типа сбора или нет.Hibernate: Hibernate всегда использует прокси-объекты?

Может кто-нибудь объяснить, когда Hibernate использует объектные прокси? Это все время или просто в некоторых случаях?

+0

Мне любопытно, что заставляет вас задавать этот вопрос. afaik вы либо получите фактический экземпляр (если он кэширован), либо прокси-сервер, который будет увлажнен, когда вы его используете. – zmf

+0

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

ответ

0

Согласно Hibernate docs:

По умолчанию Hibernate использует ленивую выберите выборку для коллекций и ленивым прокси Fetching для однозначных ассоциаций. Эти значения по умолчанию имеют смысл для большинства ассоциаций в большинстве приложений.

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

AFAIK коллекция будет инициализирована как null, пока вы не попытаетесь получить к ней доступ, после чего Hibernate попытается унаследовать ее со значениями.

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

Ничего из этого не относится, конечно, если вы используете fetchType.EAGER об ассоциации. Если вы новичок в Hibernate, я предлагаю прочитать this guide, что я написал. Он охватывает такие вещи, как типы выборки и конфиг для разных типов отношений.

+0

Спасибо за ваш ответ Джеймс. Итак, если объект не имеет никакой ассоциации (например, объект, который имеет только поля примитивных типов), то для объекта не будет создан прокси-сервер; правильно? –

+0

Да AFAIK это правильно. На практике, если вам приходится беспокоиться о том, является ли объект прокси-сервером или нет, вы можете сделать это неправильно. – JamesENL

Смежные вопросы