2009-05-20 4 views
0

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

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

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

Это то же самое с hibernateSession.flush()/hibernateSession.clean()
Я думаю, что я не очень хорошо использовать свой кэш гибернации ...Hibernate - тот же результат после обновления/выберите

ответ

1

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

3

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

Вы eith необходимо запустить новый сеанс или evict объект из сеанса.

1

Попробуйте

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.

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

Смежные вопросы