差异b / w Hibernate的Sessionfactory.getCurrentSession()和SessionFactory.openSession()

时间:2012-04-09 11:12:22

标签: java hibernate orm persistence

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

SessionFactory.openSession()添加了哪些附加值?

1 个答案:

答案 0 :(得分:38)

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

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

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

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