2009-06-22 3 views

ответ

17

lazy = "proxy" означает, что NHibernate лениво инициализирует экземпляры вашего класса; Когда NHibernate извлекает экземпляр вашего класса из базы данных, он в этом случае не вернет «реальный» экземпляр вашего класса, но скорее даст вам прокси. То есть, он вернет объект другого типа, более конкретно, объект, который является подклассом вашего класса (сгенерированный NHibernate через генерацию IL).

Объект, которому вы будете предоставлены, является прокси-сервером и единственным населенным имуществом является свойство Id. Как только вы вызываете другое свойство в экземпляре, NHibernate инициализирует прокси-сервер и извлекает из базы данных все остальные свойства/коллекции (за исключением тех, которые ленивы загружаются).

Lazy = "true" используется на другом уровне. В то время как lazy = "proxy" используется на уровне класса, lazy = "true" используется на уровне сбора. Это означает, что сбор должен быть ленивым.

+0

И в чем же отличие от ленивого = «истинного»? –

+1

Похоже, вы не ответили на вопрос. – gdoron

9

documentation reference говорит о том, что значение атрибута прокси в:

lazy="proxy|no-proxy|false" 

ленивых (по желанию - по умолчанию для прокси-сервера): По умолчанию, одиночные ассоциации точечные прокси-серверы.

lazy = "no-proxy" указывает, что свойство должно извлекаться лениво при первом обращении к переменной экземпляра (требуется инструментарий байт-кода времени сборки).

lazy = "false" указывает, что ассоциация всегда будет с нетерпением ожидаемой.

+0

Не следует lazy = "proxy" указать, что свойство должно появляться лениво при первом обращении к переменной экземпляра – 2009-06-22 13:09:20

+1

больше информации можно найти в блоге ayende: http://ayende.com/Blog/archive/2010/01/ 28/nhibernate-new-feature-no-proxy-association.aspx –

+0

Я просто переформатировал, чтобы опции были на разностных линиях. –

2

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

http://docs.jboss.org/hibernate/stable/core/reference/en/html_single/#performance-fetching-lazy

22

Я подозреваю, еще один способ думать об этом было бы это.

class Foo 
{ 
    public virtual Bar SingleBar { get; set; } 
    public virtual ICollection<Bar> MultiBar { get; set; } 
} 
  • ленивым = "прокси" относится к отдельным объектам (т.е. foo.SingleBar)
  • ленивым = "истина" относится к коллекции объектов (т.е. foo.MultiBar)

(Вы не можете установить lazy = "proxy" в коллекцию, а также не можете установить lazy = "true" на одну ссылку. Любой из них заставит NH выбросить исключение XmlSchemaException, которое является немного загадочным для новичков.)

Оперативно они делают то же самое abstr act thing: когда и только когда доступ к ресурсу осуществляется, NHibernate попадает в базу данных и заполняет свойство.

Однако существует небольшая разница в реализации из-за того, что необходимо для извлечения объектов (в одном случае идентификатор ссылки (Bar) был загружен родительским объектом (Foo). В случае сбора идентификаторы неизвестны и должны быть найдены в другой таблице)

+0

В приложении, в котором я работал, существовала разница между «прокси» и «истинным». В случае, если внешний ключ имел значение, отсутствовавшее в связанной таблице, lazy = "true" выбрал ObjectNotFoundException во время запроса Linq, тогда как lazy = "proxy" работал как ожидалось. –

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