#hibernate #nhibernate #caching
#спящий режим #nhibernate #кэширование
Вопрос:
Как я могу узнать, находится ли определенный HibernateProxy
объект в кэше первого уровня?
Код примерно
for (HibernateObject obj : objects) {
if (HibernateUtils.isHibernateProxyInCache(
obj.getExpensiveLazyObject())
) {
display(obj.getExpensiveLazyObject());
} else {
display("click here to see expensive lazy object");
}
}
мне нужен код HibernateUtils.isHibernateProxyInCache
, но я не знаю, как его реализовать.
Ответ №1:
Я думаю, вы ищете Hibernate.isPropertyInitialized
.
Вызов HibernateUtils.isHibernateProxyInCache(obj.getExpensiveLazyObject())
инициализирует прокси для дорогостоящего ленивого объекта, поэтому ваш метод всегда будет возвращать true .
Комментарии:
1. вы хотите сказать, что простой вызов
getX
инициализирует прокси? Не могли бы вы дать мне ссылку на часть документации, в которой говорится об этом? Итак, если я вас правильно понял, мне нужно сделатьHibernate.isPropertyInitialized(obj,"expensiveLazyObject")
, верно?2. Извините, я неправильно понял. Вероятно, вам просто нужен спящий режим. Инициализируется (obj.getExpensiveLazyObject()).
3. Спасибо. Но я не уверен, что понимаю, что означает «инициализированный». Можете ли вы сослаться на документы? Я не уверен, что «инициализированный» означает «в кэше первого уровня».
4. инициализированный означает: «прокси был инициализирован». Изначально прокси для объекта содержит только идентификатор объекта. Как только вы вызываете любой метод для прокси-объекта, он сначала загружает фактический экземпляр объекта со всеми его полями из базы данных, а затем делегирует этому экземпляру объекта выполнение метода. Инициализированный означает «состояние объекта загружено из базы данных». Если прокси-сервер все еще подключен к сеансу гибернации, то инициализированный прокси-сервер должен быть в кэше. Если это не то, что вам нужно, тогда, пожалуйста, уточните и посмотрите на метод, содержащийся в сеансе.