nhibernate ленивые варианты загрузки - PullRequest
26 голосов
/ 22 июня 2009

В чем разница между lazy="true" и lazy="proxy" в nhibernate?

Ответы [ 4 ]

23 голосов
/ 24 ноября 2009

Я подозреваю, что по-другому можно подумать об этом.

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

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

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

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

17 голосов
/ 22 июня 2009

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

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

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

9 голосов
/ 22 июня 2009

Справочная документация говорит о том, что значение атрибута прокси находится в:

lazy="proxy|no-proxy|false"

lazy (необязательно - по умолчанию используется прокси): по умолчанию сопоставления с одной точкой проксируются.

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

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

2 голосов
/ 21 октября 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...