Как стать автором
Обновить

Комментарии 28

Спасибо за хорошую информацию на русском.
Эх… есть одна хорошая статья на эту же тему, но в новом дизайне блога её как-то сильно «поплющило» :(
acupof.blogspot.com/2008/01/background-hibernate-comes-with-three.html
Много полезной информации в самом MindMap'е, но текст с картинок сейчас абсолютно не читаем.
Возможно у кого-то осталась старая версия?
НЛО прилетело и опубликовало эту надпись здесь
Спасибо :)
НЛО прилетело и опубликовало эту надпись здесь
Кеш запросов — на уровне фабрики сессий. Но у него есть свои механизмы инвалидации, про это написано по ссылке в первом комментарии.
НЛО прилетело и опубликовало эту надпись здесь
Если оба класса будут помечены аннотацией для кеширования, то оба объекта будут закешированы, несмотря на то что, запрос 1 с джоином.
НЛО прилетело и опубликовало эту надпись здесь
У Вас ошибка — SharedDoc user.
По вопросу — я думаю зависит от того как будет выглядеть мапинг SharedDoc в классе User.
НЛО прилетело и опубликовало эту надпись здесь
Да, в этом конкретном вопросе — это важно.
Вообщем если попытаться ответить баз маппинга, то должно быть приблизительно так —
если при session.load(User.class, 1L) делается выборка и User и SharedDoc (отдельными селектами или джоинами) то оба объекта будут в кеше. И во втором запросе значение будет доставаться из кеша.
НЛО прилетело и опубликовало эту надпись здесь
Не совсем понятен вопрос. Можно точнее сформулировать? Или описать гипотетическую ситуацию
НЛО прилетело и опубликовало эту надпись здесь
Вопрос ко второму пункту — как именно обновило? Через ту же сессию что была открыта в пункте 1? Через ту же фабрику сессий или напрямую в БД =)?
НЛО прилетело и опубликовало эту надпись здесь
Если так, то если на момент шага 3 мы имеем ту же сессию что и в случае 1, то данные будут не консистентны. Если же на шаге 3 у нас открывается новая сессия то все будет ок.
Даже если бы не было кеша первого уровня, то результат зависит ещё и от уровня изоляции в БД.
Если уровень изоляции Repeatable read или Serializable, то даже с отключенным кешем первого уровня вы получите одни и те же данные в одной транзакции, но разные в разных транзакциях.
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
НЛО прилетело и опубликовало эту надпись здесь
1. На самом деле, хибернейт сам не реализует кеширование как таковое
2. Хибернейт не хранит сами объекты Ваших классов. Он хранит информацию в виде массивов строк, чисел и т. д. И идентификатор объекта выступает указателем на эту информацию. Концептуально это нечто вроде Map, в которой id объекта — ключ, а массивы данных — значение. Приблизительно можно представить себе это так:
1 -> { «Pupkin», 1, null, {1,2,5} }

Как первое вяжется со вторым? И если второе — истина, как hibernate восстанавливает объект, если, например, для этого требуются некие хитрые действия?

PS Насколько я помню проксирование объектов можно отключить.
Отлично вяжется. Хибернейт достает объект из базы, скажем, в виде списка полей. И если провайдер кеша видит необходимость кеширования, то кеширует этот объект (который в виду списка) у себя, так как хибернейт передает ссылку на этот объект провайдеру. Как то так.

Как хибернейт восстанавливает объект из списка я не знаю. Нужно смотреть код.
Наверное, глупо звучит, но забыл что Hibernate сам маппирует объект с представлением в базе.
Не, он не передаёт ссылку. Он передаёт уже поля объекта, а не сам объект — так называемые dehydrated entity. Это сделано для того, чтобы не хранить объекты (т.к. кеш второго уровня может быть и не в вашем адресном пространстве приложения), а так же для того, чтобы испытывать меньше проблем с рассинхронизацией данных между БД, кешем и разными сессиями Hibernate
Начиная с версии Hibernate 3.3 кэш 2-го уровня включается так:

Вместо hibernate.cache.provider_class нужно указывать hibernate.cache.region.factory_class. И тут 2 варианта:
net.sf.ehcache.hibernate.EhCacheRegionFactory либо синглетон: net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory

Пруфлинк: Ehcache documentation
Точно, спасибо. Вообще не обратил на это внимание.
Так (hibernate.cache.region.factory_class) включается кеш, если в зависимостях непосредственно ehcache-core В случае старого доброго hibernate-ehcache Нужно использовать hibernate.cache.provider_class
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Изменить настройки темы

Истории