Когда спящий режим закрывает сеанс, цель закрытия в основном заключается в том, чтобы закрыть базовое соединение и очистить кеш первого уровня. Почему флеш также не происходит автоматически здесь?Почему hibernate session.close() не сбрасывает данные автоматически?
2
A
ответ
7
С transactional точки зрения, flushing очень отличается от закрытия сессии и flush
должно происходить внутри границ сделки (или по commit
времени):
Завершение сеанса обычно включает в себя четыре различны фазы:
- вровень сеанс
- совершить сделку
- закрыть сеанс
- исключения ручки
С другой стороны, закрытие сессии (и основное соединение) должно быть сделано после того, как сделка закончилась (поведение в ожидании операции при закрытии соединения есть не определено).
Таким образом, нет никаких оснований делать что-либо близко и продвигать плохую семантику, и имеет смысл иметь различные операции.
Подводя итог:
- просто использовать транзакцию и надлежащую демаркацию, как вы должны (и сессия будет сбрасываться во время фиксации, при необходимости, в зависимости от FlushMode).
- использовать
SessionFactory#getCurrentSession()
, и вам не обязательно будетSession#close()
(Session
будет закрыт для вас в момент фиксации).
Смежные вопросы
- 1. Hibernate session.close() не возвращает соединение с пулом
- 2. (Hibernate) Разница между Session.close() и releaseSession (Session)
- 3. Почему Sqlalchemy Session.close не регистрирует «откат»?
- 4. Сбрасывает ли Hibernate автоматический курсор?
- 5. Hibernate не сохраняет данные
- 6. Вызов Session.close() на HibernateDaoSupport
- 7. SQLAlchemy: session.close() или session.commit()
- 8. git удаленный url автоматически сбрасывает
- 9. Почему netcat не сбрасывает ответ?
- 10. PHP mysql_query автоматически сбрасывает слэши?
- 11. Вспышка автоматически сбрасывает специальные символы
- 12. Hibernate не создает таблицы автоматически
- 13. Hibernate Не извлекать данные
- 14. Почему ядро сбрасывает?
- 15. Hibernate не сохранять данные после использования фиксации
- 16. Почему NSMutuableArray сбрасывает себя
- 17. Почему JPA \ Hibernate автоматически не создает это отображаемое поле?
- 18. ajax call не сбрасывает старые данные
- 19. Spring + Hibernate не открывается автоматически сеанс
- 20. Hibernate данные не обновляются в базе данных
- 21. Почему это выражение не сбрасывает переменную?
- 22. Почему git clone не сбрасывает файл описания?
- 23. hibernate не может сохранить данные
- 24. hibernate создание повторяющихся столбцов автоматически
- 25. Hibernate Query автоматически Flush
- 26. Hibernate Автоматически загружать отношения
- 27. Hibernate автоматически создает индекс?
- 28. Hibernate не возвращает существующие данные
- 29. Соединения спящего режима не закрыты даже с C3P0 + явным session.close()
- 30. Почему Угловой сбрасывает выбранное значение?
@ Паскаль, я думаю, вы действительно не ответили на вопрос оп. Он не предполагал, что промывка и закрытие сеанса одинаковы, но скорее, если сеанс грязный, то при закрытии его нужно также вызвать. Это имеет смысл для меня, если вы используете FlushMode.Auto, и они обновляют постоянный объект, тогда я думаю, что Hibernate должен позаботиться о том, чтобы очистить объект в то время, когда он думает, что он это делает, Hibernate не должен игнорировать это изменение. Что я думаю, может случиться, если флеш не вызван. – Ittai
@Ittai Я уточнил свой ответ (который был недостаточно ясен), и я попытался объяснить, почему я не согласен с вами. –
@ Паскаль, спасибо за ваши разъяснения, но я до сих пор не согласен. Что касается Item2, это не имеет значения в моем случае, поскольку я использую шаблон сеанса за запрос, и иногда мне нужно, чтобы сеанс оставался открытым после фиксации. Что касается Item1, это именно то, что мне не нравится. Зачем использовать транзакцию для одного обновления? Я вижу транзакцию как способ обеспечить согласованность нескольких команд (сгруппировать их в единицу работы). Но когда есть только одна команда, зачем нам использовать транзакцию? (Кстати, я использовал JDBC все время, и это может повлиять на мои контенты). – Ittai