Hibernate - тот же результат после обновления / выбора - PullRequest
0 голосов
/ 20 мая 2009

hibernateSession.createQuery ("выберите foo, где id = 1");
// Эта команда возвращает элемент с идентификатором 1.

// [BREAK POINT STOP] ==> Я захожу в MySQL и удаляю этот элемент вручную.
// [BREAK POINT CONTINU]

hibernateSession.createQuery ("выберите foo, где id = 1");
// Эта команда также возвращает элемент с идентификатором 1! :-(

То же самое с hibernateSession.flush () / hibernateSession.clean ()
Я думаю, что я не очень хорошо использую мой спящий кеш ...

Ответы [ 3 ]

3 голосов
/ 20 мая 2009

Первый запрос загрузит этот объект в сеанс гибернации. Ваше удаление строки в базе данных не окажет влияния, так как вы используете тот же сеанс.

Вам нужно либо начать новый сеанс, либо исключить объект из сеанса.

1 голос
/ 20 мая 2009

Попробуйте это

Object o = hibernateSession.createQuery("select foo where id = 1").uniqueResult();

// [BREAK POINT STOP] ==> I go in MySQL and I delete this item manualy.

hibernateSession.evict(o);
hibernateSession.createQuery("select foo where id = 1");

Если это работает, значит, у вас проблема с кешем L1. Кэш L1 ВСЕГДА там, связан с данным объектом Session и не зависит от кеша L2, о чем говорит вся документация кеша спящего режима. Цель кэша L1 состоит в том, чтобы удовлетворить требование, что если вы получаете один и тот же объект базы данных дважды в одном сеансе, две ссылки будут удовлетворять r1 == r2.

По сути, использование спящего режима, когда возможны параллельные изменения в БД, не является простым.

1 голос
/ 20 мая 2009

Определенно проблема с кэшированием. Вы используете ту же сессию? Попробуйте закрыть сеанс и получить новый с завода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...