Методы get от load в Nhibernate - CodeHelper

Методы get от load в Nhibernate

2

В чём их отличие (какие результаты возвращают). И какие возможные ошибки могут выбросить при отсутствии данных.

Лучший ответ:

1

Если Load() не находит объект в кеше или в базе данных, то выкидывается exception. Метод Load() никогда не возвращает null.

Метод Get() возвращает null, если объект не найден

Новые ответы

Новые Лучшие

2

Есть отличие, касающееся «ленивой» загрузки. Метод Load() никогда не возвращает null и выбрасывает исключение если соответствующий объект не найден. Но если разрешена ленивая загрузка, то Load() может вернуть proxy вместо реального объекта. Сама загрузка происходит при попытке доступа к свойствам прокси. Исключение также будет выбрашено не при вызове Load(), а при обращении к прокси. С другой стороны, Get() не может вернуть прокси, потому что метод должен проверить, существует ли загружаемый объект.

Если объект уже был загружен, и храниться в кеше сессии, то Load() вернет объект из кеша без обращения к базе данных, а Get() обратиться к базе чтобы проверить, существует ли объект.

Есть интересный трюк, основанный на методе Load() (из книги NHibernate in Action):

using(ISession session = sessionFactory.OpenSession()) {
    using( session.BeginTransaction() ) {
        Category parent = session.Load<Category>(anId);  1
        Console.WriteLine( parent.Id );                  2
        Category child = new Category("test");           3
        child.ParentCategory = parent;
        session.Save(child);                             4
        session.Transaction.Commit();
    }
}

Тут происходит следующее: 1 загружается объект Category с помощью метода Load() (подразумевается, что lazy-init=true). Так как Load() возвращает прокси, то обращение к базе не происходит. Далее, выводится идентификатор категории в консоль 2. Свойство Id заполняется также без обращения к базе, потому что идентификатор был передан в метод Load() 1. Затем создается дочерняя категория 3 и связывается с уже загруженной категорией. Сохранение категории 4 вызывает генерацию INSERT-запроса. В итоге мы получаем, что дочерняя категория была добавлена без загрузки родительской категории из базы данных, так как вся работа велась с прокси.


v1.7.123.556
© 2009—2010 CodeHelper FAQ | О сайте | Обратная связь | История изменений | Статьи
Creative Commons LicenseМатериалы сайта распространяются под лицензией Creative Commons Attribution-Share Alike 3.0 Unported.