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

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

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

теперь проблема в том, что метод createQuery() EntityManager возвращает javax.стойкость.Запрос, который, в отличие от орг.зимовать.Запрос (возвращаемый методом createQuery() SessionFactory), не имеет организации.зимовать.Запрос.setCacheable() метод.

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

1 ответов


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

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

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

если вы не хотите иметь импорт hibernate в вашем коде, вы также можете сделать

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

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

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

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