2009-12-28 4 views
2

Когда спящий режим закрывает сеанс, цель закрытия в основном заключается в том, чтобы закрыть базовое соединение и очистить кеш первого уровня. Почему флеш также не происходит автоматически здесь?Почему hibernate session.close() не сбрасывает данные автоматически?

ответ

7

С transactional точки зрения, flushing очень отличается от закрытия сессии и flush должно происходить внутри границ сделки (или по commit времени):

Завершение сеанса обычно включает в себя четыре различны фазы:

  • вровень сеанс
  • совершить сделку
  • закрыть сеанс
  • исключения ручки

С другой стороны, закрытие сессии (и основное соединение) должно быть сделано после того, как сделка закончилась (поведение в ожидании операции при закрытии соединения есть не определено).

Таким образом, нет никаких оснований делать что-либо близко и продвигать плохую семантику, и имеет смысл иметь различные операции.

Подводя итог:

  1. просто использовать транзакцию и надлежащую демаркацию, как вы должны (и сессия будет сбрасываться во время фиксации, при необходимости, в зависимости от FlushMode).
  2. использовать SessionFactory#getCurrentSession(), и вам не обязательно будет Session#close() (Session будет закрыт для вас в момент фиксации).
+0

@ Паскаль, я думаю, вы действительно не ответили на вопрос оп. Он не предполагал, что промывка и закрытие сеанса одинаковы, но скорее, если сеанс грязный, то при закрытии его нужно также вызвать. Это имеет смысл для меня, если вы используете FlushMode.Auto, и они обновляют постоянный объект, тогда я думаю, что Hibernate должен позаботиться о том, чтобы очистить объект в то время, когда он думает, что он это делает, Hibernate не должен игнорировать это изменение. Что я думаю, может случиться, если флеш не вызван. – Ittai

+1

@Ittai Я уточнил свой ответ (который был недостаточно ясен), и я попытался объяснить, почему я не согласен с вами. –

+0

@ Паскаль, спасибо за ваши разъяснения, но я до сих пор не согласен. Что касается Item2, это не имеет значения в моем случае, поскольку я использую шаблон сеанса за запрос, и иногда мне нужно, чтобы сеанс оставался открытым после фиксации. Что касается Item1, это именно то, что мне не нравится. Зачем использовать транзакцию для одного обновления? Я вижу транзакцию как способ обеспечить согласованность нескольких команд (сгруппировать их в единицу работы). Но когда есть только одна команда, зачем нам использовать транзакцию? (Кстати, я использовал JDBC все время, и это может повлиять на мои контенты). – Ittai

Смежные вопросы