В чём их отличие (какие результаты возвращают). И какие возможные ошибки могут выбросить при отсутствии данных.
Методы get от load в Nhibernate
Лучший ответ:
Если Load()
не находит объект в кеше или в базе данных, то выкидывается exception
. Метод Load()
никогда не возвращает null
.
Метод Get()
возвращает null
, если объект не найден
Популярные ответы
Есть отличие, касающееся «ленивой» загрузки. Метод 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-запроса. В итоге мы получаем, что дочерняя категория была добавлена без загрузки родительской категории из базы данных, так как вся работа велась с прокси.