Hibernate 3.6 - session.get () против session.load ()
Я пытаюсь понять, в чем разница в возвращаемом объекте и поведении Hibernate 3.6session.get()
а такжеsession.load()
.
ИзJavadoc:
получить():
Вернуть постоянный экземпляр заданного класса сущности с заданным идентификатором или значение NULL, если такого постоянного экземпляра нет. (Если экземпляр уже связан с сеансом, верните этот экземпляр. Этот метод никогда не возвращает неинициализированный экземпляр.)
нагрузка ():
Вернуть постоянный экземпляр заданного класса сущности с заданным идентификатором, предполагая, что экземпляр существует. Этот метод может возвращать прокси-экземпляр, который инициализируется по требованию при обращении к методу без идентификатора.
У меня три вопроса:
Javadoc не говорит, когдаload()
может вернуть прокси - есть ли способ узнать это заранее?
когдаload()
возвращает прокси - это значитload()
не получил доступ к базе данных, я прав? Тогда что, если я предоставилload()
с идентификатором, который не существует в базе данных? Теперь у меня будет сеанс с недействительным идентификатором (без исключения). Теперь я хочу позволить другому постоянному экземпляру указывать на этот прокси - это будет работать? Для этого сценария мне не нужно инициализировать прокси, мне нужен только его идентификатор (который у меня есть, хотя он недействителен, поскольку его нет в базе данных). Итак, я думаю, что спрашиваю, правильно ли мое описание, и мне всегда нужно проверять послеload()
возвращенный объект сisInitialized()
чтобы удостовериться, что он представляет действительный объект (или, по крайней мере, действительный прокси-сервер), то есть с действительным идентификатором.
Кроме того, что произойдет, еслиload()
возвращает прокси - таким образом, прокси является экземпляром, который уже связан с сеансом. Тогда согласно описаниюget()
: "Если экземпляр уже связан с сеансом, верните этот экземпляр." - так жеget()
вернуть прокси? Так как согласно описаниюget()
: "Этот метод никогда не возвращает неинициализированный экземпляр."
Спасибо!
ОБНОВИТЬ
Правильно ли следующее?
(A) Я думаю, что обаload()
а такжеget()
сначала попытается проверить кэш сеанса перед тем, как перейти к БД, поэтому было бы неправильно утверждать, что любой из них всегда обращается к БД или всегда возвращает прокси.
(B) Инициализированный прокси-сервер отличается от исходного экземпляра, как вы можете прочитать здесь:http://blog.xebia.com/2008/03/08/advanced-hibernate-proxy-pitfalls/