Запрос к 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 по умолчанию связаны с кэшем первого уровня, а запрос критерия - нет. В вашем случае есть два решения с моей стороны
Сбрасывая сессию = просто очистите сессию вот так
session.flush();
при этом данные из сеанса будут синхронизироваться с базой данных, следовательно, будет сгенерирован Id, и в результате запрос Criteria найдет результат в базе данных и выдаст вам список результатов.Включить кэш второго уровня гибернации = Вы можете включить кэш второго уровня провайдерами кэша гибернации, такими как 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, но имейте в виду: эти объекты не привязаны ни к какому сеансу, и вы получите исключения, если захотите разрешить отношения или ленивые поля!