3 回答
TA贡献1828条经验 获得超13个赞
如果我们谈论SessionFactory.openSession()
它总是创建一个新的Session对象。
您需要显式刷新和关闭会话对象。
在单线程环境中,它比getCurrentSession()慢。
您无需配置任何属性即可调用此方法。
如果我们谈论SessionFactory.getCurrentSession()
如果不存在,它会创建一个新的Session,否则使用当前hibernate上下文中的相同会话。
您不需要刷新和关闭会话对象,Hibernate会在内部自动处理它。
在单线程环境中,它比openSession()更快。
您需要配置其他属性。“hibernate.current_session_context_class”调用getCurrentSession()方法,否则会抛出异常。
TA贡献1798条经验 获得超7个赞
openSession
:当你打电话时SessionFactory.openSession
,它总是创建一个新Session
对象并交给你。
您需要显式刷新和关闭这些会话对象。
由于会话对象不是线程安全的,因此您需要在多线程环境中为每个请求创建一个会话对象,并在Web应用程序中为每个请求创建一个会话。
getCurrentSession
:当你调用时SessionFactory.getCurrentSession
,它将为你提供处于休眠上下文并由内部hibernate管理的会话对象。它与事务范围有关。
当你调用时SessionFactory.getCurrentSession
,它会创建一个新的,Session
如果它不存在,否则使用当前hibernate上下文中的相同会话。它会在事务结束时自动刷新和关闭会话,因此您无需在外部执行此操作。
如果您在单线程环境中使用hibernate,则可以使用getCurrentSession
,因为与每次创建新会话相比,它的性能更快。
您需要将以下属性添加到hibernate.cfg.xml以使用getCurrentSession
方法:
<session-factory> <!-- Put other elements here --> <property name="hibernate.current_session_context_class"> thread </property></session-factory>
添加回答
举报