Что это кеширование?

12 views
Skip to first unread message

Igor Ussov

unread,
Jan 25, 2011, 5:07:40 AM1/25/11
to rugr...@googlegroups.com
Приветствую!

Столкнулся с такой проблемой. Есть у меня такая связь доменов:

class Sale {
Client client
}

class Client {
String barcode
static hasMany = [sales:Sale]
}

Когда я в сервисе вызываю метод, который меняет связи с одного Client
на другого Client:

def move(params) {
Sale.executeUpdate("update Sale s set s.client = :cardRight where
s.client = :cardLeft", [cardRight: cardRight, cardLeft: cardLeft])
}

Если после выполнения метода сделать так:

def cardLeft = Client.findByBarcode(barcode1)
def cardRight = Client.findByBarcode(barcode2)

то в cardLeft и cardRight по прежнему старые связи на Sale. И только
после повторного запуска кода можно увидеть что данные обновились. Что
это проделки кеша? Как с этим бороться?


--
________________________________
Regards Igor

Bugdog

unread,
Jan 25, 2011, 5:36:34 AM1/25/11
to ruGrails
Да, это кэширование Hibernate. Во время каждого сеанса работы с БД
(session), Hibernate подтягивает доменные объекты в кэш. На каждый
сеанс свой кэш. Сенас создается обычно на одну HttpSession.

В вашем случае, если после executeUpdate вы постараетесь сохранить
cardLeft или cardRight, то получите StaleStateException, если конечно
не отключена версионирование этих объектов. Это специальная проверка
целостности, которую делает Hibernate.

Выходов два:

1) Совершать изменения через GORM, т.е. через ваши доменные объекты, и
затем вызывать каждому из них .save, например cardLeft.save(), или
cardLeft.save(flush:true). Во втором случае запись в базу из кэша
произойдет тут же.

2) Поскольку изменения в БД не переносятся автоматически в сессию, то
нужно вызвать refresh для всех объектов, затрагиваемых запросом. Т.е.
cardLeft.refresh(), cardRight.refresh().

Igor Ussov

unread,
Jan 25, 2011, 5:46:43 AM1/25/11
to rugr...@googlegroups.com
благодарю. второй способ помог.

25 января 2011 г. 16:36 пользователь Bugdog <drpa...@googlemail.com> написал:

> --
> Вы получили это сообщение, поскольку подписаны на группу ruGrails.
>
> Чтобы добавлять сообщения в эту группу, отправьте письмо по адресу rugr...@googlegroups.com.
> Чтобы отменить подписку на эту группу, отправьте сообщение по адресу rugrails+u...@googlegroups.com.
> О дополнительных функциях можно узнать в группе по адресу http://groups.google.com/group/rugrails?hl=ru.
>
>

--
________________________________
Regards Igor

Andrey Degtiarev

unread,
Jan 25, 2011, 5:32:59 AM1/25/11
to rugr...@googlegroups.com
Попробуй сохранить после апдейта

25 января 2011 г. 13:07 пользователь Igor Ussov <ius...@gmail.com> написал:

> --
> Вы получили это сообщение, поскольку подписаны на группу ruGrails.
>
> Чтобы добавлять сообщения в эту группу, отправьте письмо по адресу rugr...@googlegroups.com.
> Чтобы отменить подписку на эту группу, отправьте сообщение по адресу rugrails+u...@googlegroups.com.
> О дополнительных функциях можно узнать в группе по адресу http://groups.google.com/group/rugrails?hl=ru.
>
>

--
С уважением,
 Дегтярев Андрей                          mailto:adegt...@gmail.com

Reply all
Reply to author
Forward
0 new messages