, как предполагает тема, у меня возникли некоторые проблемы с Hibernate и EhCache.
Я использую Hibernate с mySql и EhCache в Resteasy-приложении.
Модель: Естьэто несколько сущностей, некоторые отношения один-ко-многим и некоторые отношения один-к-одному.
- Измерение
- информации заголовка (один-к-одному)
- content (один-к-одному)
- мест (один-к-одному (этот элемент мне нужен из-за его метаданных)
- place (коллекция с объектами-местами) (one-to-мани ленивый)
- мера (коллекция с сущностями меры) (ленивый один-ко-многим)
- тайм-код (коллекция с тайм-кодом тайм-кода (ленивый один ко многим)
- мера (сбор с единицами измерения) (один-ко-многим ленивый)
Проблема: я пытаюсь получить все свои данные в запросе типа createQuery("from Measuring c").list()
. Теперь есть два способа кэширования результата: Querycache и 2nd-level-cache.
кеш запросовЯ буду только кэшировать выбор для объекта измерения, не говоря уже о том, что это не то поведение, которого я ожидал.Я хочу, чтобы кеш запросов кешировал все sql-операторы.Есть ли способ заставить это работать?
Я активировал кеш для всех сущностей.Кэш 2-го уровня будет кэшировать элементы, но не ударит их снова (хорошо, но только измеряющий элемент);Через несколько небольших мыслей я понял, что мне нужно кэшировать коллекции, чтобы кеш знал, какие элементы принадлежат друг другу.
Что ж, активация кэшей для всех коллекций «один ко многим» прекрасно работает в случае извлечения всех данных.как первый запрос кеша.Но если бы не было проблемы, я бы не написал это.Запрос места по одному из его полей в качестве первого действия кеша заставит кеш делать то, что он должен: он кеширует запрошенные данные, что означает измеряющий объект (фактически в базе данных есть только один), информация заголовка, контентс местами-элементом и найденным местом с его подэлементами.Запросы в другое место также отлично работает.Теперь я хочу получить все элементы (запрос, упомянутый выше), но я получаю только уже запрошенные.Похоже, что hibernate запрашивает только кэш, если инструкция не содержит критериев выбора.Это кажется маленькой проблемой при кэшировании коллекций.
Итак, мне нужно либо получить кеш запросов для кэширования всех операторов, либо кеш 2-го уровня, извлекающий всю коллекцию, если она запрошена, но уже была выполнена конкретная.
Я также должен упомянуть, что при извлечении конкретного места (или всех элементов) мне нужно получить полный измерительный элемент (с его заголовком и т. Д.), Потому что служба поддержки отвечает в xml и приложениях надругой стороне нужно получить измерительный элемент со всеми его возможными узлами.
Ну, я могу представить, что в моих запросах есть некоторые ошибки.Итак, вот оба упомянутых запроса:
Получить все данные: createQuery("from Measuring c").setCacheable(true).list()
Получить данные с конкретным местом: createQuery("from Measuring measuringElement join fetch measuringElement.content contentElement join fetch contentElement.places placesElement join fetch placesElement.places placeElement WHERE placeElement.name = '" + name +"'").setCacheable(true).list()
.
Кто-нибудь может мне помочь?
Большое спасибо заранее и всего наилучшего