Если ваши сущности собирают мусор, нет смысла собирать и сеанс. Сессия будет GCed тогда или позже.
Например, если я сохраню ссылку на сеанс в статическом списке, я могу часами запускать свое приложение, объекты будут собираться, но не сеансы ...
Сессия должна быть закрыта явно.
Если вам не нравится явное закрытие в вашем коде, я полностью согласен с вами и многими другими людьми. : -)
Распространенным решением является выполнение закрытия в коде фреймворка, то есть в коде, который написан один раз и применяется ко всем вашим транзакциям. Это может произойти в суперклассе, например, если все ваши транзакции реализованы с помощью шаблона команды.
Однако наиболее распространенный шаблон реализации - это использование AOP для решения такой глобальной проблемы. В наших проектах используется Spring, который предоставляет готовую поддержку для закрытия всех сеансов гибернации (и связанной транзакции) с дополнительной функцией для commit / rollback :
- если выдается исключение, для транзакции вызывается откат до закрытия
- в противном случае вызывается commit.