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