Чтобы строго ответить на этот вопрос, по умолчанию Hibernate действительно сбрасывает сеанс при выполнении запроса так,что вы не получите устаревших результатов.Вы можете изменить это поведение, используя пользовательский FlushMode
(COMMIT или НИКОГДА).Из документации:
Иногда сеанс выполняет SQL-операторы, необходимые для синхронизации состояния соединения JDBC с состоянием объектов, хранящихся в памяти.Этот процесс, называемый сбросом, происходит по умолчанию в следующих точках:
- перед выполнением некоторых запросов
- с
org.hibernate.Transaction.commit()
- с
Session.flush()
Операторы SQL выдаются в следующем порядке:
- все вставки сущностей в том же порядке, соответствующие объекты были сохранены с использованием
Session.save()
- всех обновлений сущностей
- все удаления коллекции
- все удаления, обновления и вставки элементов коллекции
- все вставки коллекции
- все удаления сущностей в том же порядке, соответствующие объекты были удаленыиспользование
Session.delete()
Исключением является то, что объекты, использующие генерацию собственных идентификаторов, вставляются при их сохранении.
За исключением случаев, когда вы явно flush()
, нет никаких гарантий относительно того, когдаСеанс выполняет вызовы JDBC, только порядок, в котором они выполняются.Однако Hibernate гарантирует, что Query.list(..)
никогда не вернет устаревшие или неверные данные.
Можно изменить поведение по умолчанию, чтобы сброс происходил реже. Класс FlushMode
определяет три различных режима: сбрасывать только во время фиксации, когда используется Hibernate Transaction API, сбрасывать автоматически, используя объясненную процедуру, или никогда не сбрасывать, если явно не вызывается flush()
.Последний режим полезен для длительных единиц работы, когда сеанс остается открытым и отключенным в течение длительного времени (см. Раздел 11.3.2, «Расширенный сеанс и автоматическое управление версиями» ).
sess = sf.openSession();
Transaction tx = sess.beginTransaction();
sess.setFlushMode(FlushMode.COMMIT); // allow queries to return stale state
Cat izi = (Cat) sess.load(Cat.class, id);
izi.setName(iznizi);
// might return stale data
sess.find("from Cat as cat left outer join cat.kittens kitten");
// change to izi is not flushed!
...
tx.commit(); // flush occurs
sess.close();
Во время сброса может возникнуть исключение (например, если операция DML нарушает ограничение).Поскольку обработка исключений требует некоторого понимания транзакционного поведения Hibernate, мы обсудим это в Глава 11, Транзакции и параллелизм .
Но, честно говоря, я не уверен, что понимаю, что вы 'мы пытаемся это сделать (и, возможно, это всего лишь пример, но ваш HQL-запрос неверен).