Подтвердить что ты не робот

Разница b/w Hibernate Sessionfactory.getCurrentSession() и SessionFactory.openSession()

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

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

4b9b3361

Ответ 1

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

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

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

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