У меня возникли некоторые проблемы с пониманием того, откуда запрос HQL
получает информацию. В моем проекте используются разные потоки, и каждый поток читает/записывает в базу данных. Потоки не совместно используют объекты сеанса, вместо этого я использую класс HibernateUtil
, который создает для меня сеансы.
До недавнего времени я закрывал сеанс только после написания, но не после прочтения. Изменения в объектах будут немедленно видны в базе данных , нопри чтении в других потоках (другой объект сеанса, отличный от того, который используется для записи) я получу устаревшую информацию. Чтение и запись всегда происходили в разных потоках, что означает разные объекты сеанса и разные кэши сеансов.
Я всегда думал, что, используя HQL
вместо Criteria
, я всегда буду ориентироваться на базу данных (или кеш второго уровня), а не на кеш сеанса, но при отладке моего кода это мне было ясно, что HQL ищет объект в кэше сеанса и извлекает старый устаревший объект.
Был ли я не прав, полагая, что HQL
всегда нацелен на базу данных? Или хотя бы кэш второго уровня?
PS: я использую только один объект SessionFactory
.