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