Разница ч/б Hibernate Sessionfactory.getCurrentSession () и SessionFactory.openSession()


Я немного путаюсь между этими двумя понятиями. Как я знаю, оба возвращают сеанс hibernate, SessionFactory.getCurrentSession() возвращает контекстный сеанс, основанный на свойстве <property name="current_session_context_class">, которое установлено в hibernate.контекстно-свободная грамматика.XML Разве мы не должны всегда следовать этому подходу?

Какую дополнительную ценность добавляет SessionFactory.openSession()?

1 18

1 ответ:

Сеанс открывается всякий раз, когда sf.getCurrentSession() вызывается в первый раз. Это создает совершенно новый сеанс, если он не существует, или использует существующий, если он уже существует.

В Tomcat это связывает сеанс с потоком, который создается с использованием базового объекта ThreadLocal. Но поскольку Tomcat использует пул потоков, вполне возможно, что запрос может получить поток с уже связанной с ним сессией, таким образом, вводя возможность даже не создавать совершенно новый сессия. Другое дело, что сессия, которую вы получили с помощью sf.getCurrentSession(), сбрасывается и закрывается автоматически.

С другой стороны, метод sf.openSession() создает новый сеанс, но не пытается связать его с потоком. Но помните, что sf.openSession() вводит еще одну загвоздку в том, что он ожидает, что пользователи будут обрабатывать закрытие и промывку сессий сами, вместо того, чтобы позволить Hibernate делать это автоматически для нас.

sf.getCurrentSession() обычно этого достаточно. sf.openSession() обеспечивает и облегчает большую уровень управления местом хранения и управления сеансом. Это, безусловно, продвинутый вариант.