Я пытаюсь понять, как работает кеш-память спящего режима. Теперь я вижу, что Hibernate не обновляет свой кеш второго уровня автоматически, когда я вставляю новые сущности в базу данных (хотя я использую только вызовы Hibernate). Единственный способ, которым я нашел, чтобы он работал, - это вручную очистить кеш после вставки новых объектов.недействительность кеша автоматического запроса
Вот более конкретный пример. У меня есть постоянная сущность, называемая Контейнер, которая может иметь много элементов. Я хотел, чтобы все элементы в кэше:
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE) class Item { // rest of the code ... } class Container { @Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public List getItems() { ... } // rest of the code ... }
Проблема, которую я заметил, что когда я:
1) читать некоторые контейнеры из БД в памяти (вместе с соответствующими элементами)
String hql =
"from Container c left join fetch c.items where c.type = 1";
List<Item> list = hibernateTemplate.find(hql);
2) вставить новый пункт для выбранной контейнерной
hibernateTemplate.save(item)
3) повторить пихта st step
, то на третьем этапе я не вижу элемент, который я вставил на втором шаге. Я вижу их только тогда, когда я очистить кэш вручную после установки новых элементов:
sessionFactory.evictCollection("Container.items", updatedContainerId)
Моя интуиция подсказывает мне, что Hibernate должен сделать такой недействительность кэша автоматически. Кто-нибудь видел, как он работает? Я что-то делаю неправильно или просто не поддерживается?
Заранее благодарим за ответ. Приветствия Том
Я только что ответил на этот день: http://stackoverflow.com/questions/4500221/hibernate-sqlquery-bypasses-hibernate-session-cache/10828200#10828200 – 2012-06-04 17:51:59