Кеширование спящего объекта на поле, отличном от идентификатора - PullRequest
2 голосов
/ 15 сентября 2011

У меня есть объект с первичным ключом без данных (@Id) и уникальным, но значимым атрибутом (stockTicker).Клиенты этой организации иногда запрашивают результаты по критериям @Id, а иногда - по критерию stockTicker.Я бы хотел, чтобы кэш мог работать по любому из критериев.Критерии @Id не проблема.Я могу придумать 2 решения для попаданий в кеш на stockTicker.Я могу создать отдельную сущность и установить @Id на stockTicker, который позволит использовать кэш второго уровня.В качестве альтернативы я могу включить кеш запросов.Я не хочу включать кеш запросов, потому что в том же EntityManager есть другие сущности, которые я не хочу кэшировать.Таким образом, мне пришлось бы разбить этот запрос на отдельную единицу персистентности.Пожалуйста, предложите, если один из этих подходов является правильным или есть лучший вариант.

@Entity
@Immutable
@Cache(usage= CacheConcurrencyStrategy.READ_ONLY)
@Table(name = "Security")
public class SecurityEntity {
    @Id
    private Integer id;
    private String stockTicker;
...

1 Ответ

2 голосов
/ 15 сентября 2011

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

Однако, учитывая вашу объектную модель, я бы выбрал опцию кэширования запросов. К счастью, похоже, что Hibernate позволяет вам контролировать кэш запросов достаточно детально :

Как упоминалось выше, большинство запросов не извлекают выгоду из кэширования или их результатов. Поэтому по умолчанию отдельные запросы не кэшируются даже после включения кэширования запросов. Чтобы включить кэширование результатов для определенного запроса, вызовите org.hibernate.Query.setCacheable (true). Этот вызов позволяет запросу искать существующие результаты кэша или добавлять его результаты в кэш при его выполнении.

Вы очень разумно используете интерфейс JPA для Hibernate, но с этим, я думаю, вы можете получить тот же эффект , используя подсказку запроса :

org.hibernate.cacheable: независимо от того, кэшируется ли запрос (например, new Boolean (true)), по умолчанию используется значение false

Я ни в коем случае не эксперт по Hibernate, но, похоже, вам не нужно переводить вашу сущность в одиночное заключение в ее отдельном постоянном блоке, чтобы включить ее кэширование запросов.

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