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