Разница ч/б Hibernate Sessionfactory.getCurrentSession () и SessionFactory.openSession()
Я немного путаюсь между этими двумя понятиями. Как я знаю, оба возвращают сеанс hibernate, SessionFactory.getCurrentSession()
возвращает контекстный сеанс, основанный на свойстве <property name="current_session_context_class">
, которое установлено в hibernate.контекстно-свободная грамматика.XML
Разве мы не должны всегда следовать этому подходу?
Какую дополнительную ценность добавляет SessionFactory.openSession()
?
1 ответ:
Сеанс открывается всякий раз, когда
sf.getCurrentSession()
вызывается в первый раз. Это создает совершенно новый сеанс, если он не существует, или использует существующий, если он уже существует.В Tomcat это связывает сеанс с потоком, который создается с использованием базового объекта
С другой стороны, методThreadLocal
. Но поскольку Tomcat использует пул потоков, вполне возможно, что запрос может получить поток с уже связанной с ним сессией, таким образом, вводя возможность даже не создавать совершенно новый сессия. Другое дело, что сессия, которую вы получили с помощьюsf.getCurrentSession()
, сбрасывается и закрывается автоматически.sf.openSession()
создает новый сеанс, но не пытается связать его с потоком. Но помните, чтоsf.openSession()
вводит еще одну загвоздку в том, что он ожидает, что пользователи будут обрабатывать закрытие и промывку сессий сами, вместо того, чтобы позволить Hibernate делать это автоматически для нас.
sf.getCurrentSession()
обычно этого достаточно.sf.openSession()
обеспечивает и облегчает большую уровень управления местом хранения и управления сеансом. Это, безусловно, продвинутый вариант.