我两者之间有点困惑。据我所知,两者都返回hibernate会话,SessionFactory.getCurrentSession()
返回基于hibernate.cfg.xml中设置的属性<property name="current_session_context_class">
的上下文会话
我们不应该总是采用这种方法吗?
SessionFactory.openSession()
添加了哪些附加值?
答案 0 :(得分:38)
首次调用sf.getCurrentSession()
时会打开会话。如果一个会话不存在,则会创建一个全新的会话,如果已存在,则会使用现有会话。
在Tomcat中,这会将会话与使用基础ThreadLocal
对象创建的线程相关联。但是由于Tomcat使用线程池,因此完全有可能请求可能会收到一个已与其关联的会话的线程,从而引入甚至不创建全新会话的可能性。另一件事是您使用sf.getCurrentSession()
获得的会话会自动刷新并关闭。
另一方面,方法sf.openSession()
创建一个新会话,但不会尝试将其与一个线程相关联。但请记住sf.openSession()
引入了另一个障碍,它希望用户自己处理会话的关闭和刷新,而不是让Hibernate自动为我们做。
sf.getCurrentSession()
通常就足够了。 sf.openSession()
提供并促进对会话存储和管理位置的更高级别管理。这当然是一种先进的选择。