Получение объектов по идентификатору
Следующий фрагмент кода Hibernate извлекает объект User из базы данных:
User user = (User) session.get(User.class, userID);
Метод get()
является специальным, поскольку идентификатор уникальным образом идентифицирует один экземпляр класса.Следовательно, приложения обычно используют идентификатор в качестве удобного дескриптора постоянного объекта.Извлечение по идентификатору может использовать кеш при извлечении объекта, избегая попадания в базу данных, если объект уже кеширован.Hibernate также предоставляет метод load()
:
User user = (User) session.load(User.class, userID);
Метод load () старше;get () был добавлен в API Hibernate по запросу пользователя.Разница тривиальна:
Если load()
не может найти объект в кэше или базе данных, возникает исключение.Метод load () никогда не возвращает ноль.Метод get()
возвращает null
, если объект не может быть найден.
Метод load()
может возвращать прокси вместо реального постоянного экземпляра.Прокси-сервер - это заполнитель, который запускает загрузку реального объекта при первом обращении к нему;мы обсудим прокси позже в этом разделе.С другой стороны, get()
никогда не возвращает прокси.
Выбор между get()
и load()
очень прост: Если вы уверены, что постоянный объект существует, и его не существуетсчитаться исключительным, load()
хороший вариант.Если вы не уверены, что существует постоянный экземпляр с данным идентификатором, используйте get()
и проверьте возвращаемое значение, чтобы увидеть, является ли оно нулевым.Использование load()
имеет еще одно значение: приложение может получить действительную ссылку (прокси) на постоянный экземпляр, не обращаясь к базе данных, чтобы получить его постоянное состояние.Так что load()
может не выдавать исключение, если оно не находит постоянный объект в кеше или базе данных;исключение будет выдано позже при доступе к прокси.
Конечно, получение объекта по идентификатору не так гибко, как при использовании произвольных запросов.
См. также HibernateДокументация (ссылки ниже).