Выполняет ли session.save() немедленную вставку?

#java #hibernate

#java — язык #впадать в спящий режим #java #переход в спящий режим

Вопрос:

…или он ожидает, пока связанная транзакция не будет зафиксирована?

Я использую запрос HQL в цикле, подобном этому:

 tx.begin()
for(...)
{
    session.getNamedQuery(...).list()
    ...
    session.save(new MyEntity())
}
tx.commit()
  

Именованный запрос должен иметь возможность видеть объекты, которые были добавлены с помощью вызова save. Будет ли это работать таким образом?

Комментарии:

1. Безусловно, самый простой способ выяснить, работает ли это.

Ответ №1:

Это зависит от режима сброса сеанса. Вы также можете вручную промыть его с помощью session.flush()

Режим промывки можно установить несколькими способами — session.setFlushMode(..) , entityManager.setFlushMode(..) или с помощью конфигурации xml ( org.hibernate.FlushMode ).

Значение по умолчанию равно AUTO :

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

Ответ №2:

Попробуйте, если это не так, затем вызовите

 session.flush()
  

чтобы отправить SQL в базу данных. В любом случае, это не будет зафиксировано до тех пор, пока вызов

 tx.commit()