17

我在两者之间有点困惑。据我所知,两者都返回休眠会话,SessionFactory.getCurrentSession()返回基于<property name="current_session_context_class">在 hibernate.cfg.xml 中设置的属性的上下文会话我们不应该总是采用这种方法吗?

增加了什么附加值SessionFactory.openSession()

4

1 回答 1

37

sf.getCurrentSession()每次第一次调用时都会打开一个会话。如果一个会话不存在,这将创建一个全新的会话,如果一个会话已经存在,则使用一个现有会话。

在 Tomcat 中,这将会话与使用底层ThreadLocal对象创建的线程相关联。但是由于 Tomcat 使用线程池,完全有可能一个请求可能会接收到一个已经与它关联的会话的线程,因此引入了甚至不创建全新会话的可能性。另一件事是您获得的 Session 会sf.getCurrentSession()自动刷新和关闭。

sf.openSession()另一方面,该方法创建一个新会话,但不尝试将其与线程相关联。但是请记住sf.openSession(),它引入了另一个障碍,它希望用户自己处理会话的关闭和刷新,而不是让 Hibernate 自动为我们做这件事。

sf.getCurrentSession()通常就足够了。sf.openSession()提供并促进对会话存储和管理位置的更高级别的管理。这当然是一个高级选项。

于 2012-04-09T12:23:24.750 回答