Запрос к Hibernate кешу

У меня есть следующий код:

Person a = new Person();
a.setName("John");

Session session = openHibernateSession();

session.beginTransaction();

session.saveOrUpdate(a);

Criteria critera = session.createCriteria(Person.class);
critera.add(Restrictions.eq("name","John"));
Person personFromCache = (Person) criteria.uniqueResult();

...

session.commit();

Я хочу иметь возможность искать объекты как в базе данных, так и в кэше Hibernate. В следующем примере возвращается ноль при вызове uniqueResult, Есть ли способ получить сохраненные объекты, которые еще не были переданы в базу данных?

5 ответов

Если вы ищете не ID, то Hibernate не будет использовать кэш первого уровня. Получение и загрузка Hibernate по умолчанию связаны с кэшем первого уровня, а запрос критерия - нет. В вашем случае есть два решения с моей стороны

  1. Сбрасывая сессию = просто очистите сессию вот так session.flush(); при этом данные из сеанса будут синхронизироваться с базой данных, следовательно, будет сгенерирован Id, и в результате запрос Criteria найдет результат в базе данных и выдаст вам список результатов.

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

Он возвращает данные, даже если вы выбираете на основе имени пользователя. Это не возвращает ноль.

session.beginTransaction();

session.saveOrUpdate(a);

session.flush();

Criteria critera = session.createCriteria(Person.class);
critera.add(Restrictions.eq("name","John"));
Person personFromCache = (Person) criteria.uniqueResult();

Мы делаем некоторые похожие вещи, за исключением использования тестовой среды TestNg. Некоторые ответы обсуждают вызов метода session.flush(). Это правильно. Вызов flush указывает Hibernate сделать несколько вещей, в том числе убедиться, что все вызовы базы данных, ожидающие в очереди в данный момент, выполняются и удаляются из очереди.

Вы можете использовать StatelessSession, но имейте в виду: эти объекты не привязаны ни к какому сеансу, и вы получите исключения, если захотите разрешить отношения или ленивые поля!

Другие вопросы по тегам