В чем разница между lazy="true"
и lazy="proxy"
в nhibernate?
Nhibernate lazy load options
Ответ 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