Подтвердить что ты не робот

HIbernate Entity Manager: как кэшировать запросы?

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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