HIbernate Entity Manager: How to cache queries?

I am using the Hibernate 3.5.1 and EntityManager for data persistence (with JPA 2.0 and EHCache 1.5). I can obtain the query by the following code:

EntityManager em;
...
Query query = em.createQuery(...);
...

Now, the problem is that EntityManager's createQuery() method returns javax.persistence.Query which, unlike org.hibernate.Query (returned by the SessionFactory's createQuery() method), does not have the org.hibernate.Query.setCacheable() method.

How am I, then, supposed to cache the queries with EntityManager (or some other part of Hibernate)?

13
задан eold 25 August 2010 в 20:35
поделиться

1 ответ

Вы можете использовать метод unwrap, чтобы получить доступ к реализации поставщика, если вы хотите использовать расширения, специфичные для поставщика. например,

org.hibernate.Query hquery = query.unwrap(org.hibernate.Query.class);

Затем вы можете работать со специфическим интерфейсом производителя. В качестве альтернативы вы можете просто развернуть свой EntityManager в сеанс , прежде чем создавать запрос.

Если вы не хотите, чтобы в вашем коде был импорт в спящий режим, вы также можете сделать

query.setHint("org.hibernate.cacheable", Boolean.TRUE);

На самом деле, зависит от вас, каким образом вы предпочтете ввести зависимость от поставщика.

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

Другие люди предпочли бы иметь в коде магические строки, зависящие от производителя, вместо необходимости иметь зависимость от производителя во время компиляции.

25
ответ дан 1 December 2019 в 21:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: