Можно ли смешивать session.save и различные обновления HQL, которые зависят от сохранения этой сущности? - PullRequest
3 голосов
/ 03 августа 2010

У меня есть функция с аргументом сеанса, которая выполняет различные запросы HQL и операторы обновления HQL в спящем режиме. Они создают sql, который идет против многих таблиц. Все в одной транзакции.

Теперь я хочу добавить одну сущность, от которой зависит эта функция, в другую функцию с помощью session.save, а затем вызвать первую функцию. Я обеспокоен тем, что Hiberante не вызовет SQL, связанный с session.save (myentity), до выполнения запросов и обновлений HQL, которые зависят от первого. Какое-то кеширование в сессии и переупорядочение операторов.

Andy

1 Ответ

3 голосов
/ 03 августа 2010

Меня беспокоит, что Hibernate не вызовет SQL, связанный с session.save (myentity), до выполнения запросов и обновлений HQL, которые зависят от первого.

документация довольно хорошо объясняет, что вызывает сброс:

10.10.Сброс сеанса

Иногда сеанс выполняет SQL-операторы, необходимые для синхронизации состояния соединения JDBC с состоянием объектов, хранящихся в памяти.Этот процесс, называемый сбросом, происходит по умолчанию в следующих точках:

  • до выполнения некоторых запросов
  • с org.hibernate.Transaction.commit()
  • с Session.flush()

Операторы SQL выдаются в следующем порядке:

  1. все вставки сущностей в том же порядке, соответствующие объекты были сохранены с использованием Session.save()
  2. всех обновлений сущностей
  3. все удаления коллекций
  4. все удаления, обновления и вставки элементов коллекции
  5. все вставки коллекции
  6. все удаления объектов в том же порядке, соответствующие объекты были удаленыusing Session.delete ()

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

За исключением случаев, когда вы явно flush(), никаких гарантий не существуето том, когда Session выполняет вызовы JDBC, только порядок, в котором они выполняются.Однако Hibernate гарантирует, что Query.list(..) никогда не вернет устаревшие или неверные данные.

Я не знаю, что именно выполняет ваша функция и в каком порядке, но документация явная:выполнение запроса вызовет сброс при необходимости.Я не уверен, что это относится к массовым обновлениям , хотя (почему я упомянул порядок).Но почему вы не промываете после сохранения, если хотите быть уверенным?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...