HIbernate Entity Manager: Как кэшировать запросы? - PullRequest
13 голосов
/ 26 августа 2010

Я использую Hibernate 3.5.1 и EntityManager для сохранения данных (с JPA 2.0 и EHCache 1.5). Я могу получить запрос по следующему коду:

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

Теперь проблема в том, что метод createQuery () EntityManager возвращает javax.persistence.Query, который, в отличие от org.hibernate.Query (возвращаемого методом createQuery () SessionFactory), не имеет org.hibernate.Query.setCacheable () метод.

Как же тогда я должен кэшировать запросы с EntityManager (или какой-то другой частью Hibernate)?

1 Ответ

25 голосов
/ 26 августа 2010

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

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

Затем вы можете работать с конкретным интерфейсом поставщика. Кроме того, вы можете просто развернуть ваш EntityManager до Session, прежде чем создавать запрос.

Если вы не хотите импортировать код из спящего режима, вы также можете сделать

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

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

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

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

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