2010-08-25 3 views
12

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

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

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

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

ответ

24

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

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

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

Если вы не хотите иметь какие-либо импорт зимуют в вашем коде, вы также можете сделать

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

Действительно до вас, какой путь вы хотели бы ввести поставщика зависимость.

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

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

+1

Спасибо за подсказки. Я буду использовать «магические строки с конкретными поставщиками» со строкой, импортированной из постоянного класса держателя (например, HibernateHintConstants), которая гарантирует, что сгенерирована ошибка компиляции, если я удалю Hibernate (при условии, что я помню, чтобы удалить класс с соответствующими константами к подсказкам Hibernate). – eold

+4

@leden - строки уже находятся в org.hibernate.ejb.QueryHints, чтобы не изобретать колесо. – OrangeDog

+0

Вы также можете добавить подсказки в аннотации @NamedQuery – OrangeDog

Смежные вопросы