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

Nhibernate lazy load options

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

4b9b3361

Ответ 1

Я подозреваю, что другой способ задуматься над этим будет.

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). В случае сбора идентификаторы неизвестно и должно быть найдено в другой таблице)

Ответ 2

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

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

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

Ответ 3

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

lazy="proxy|no-proxy|false"

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

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

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

Ответ 4

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

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