Hibernate 中的openSession和GetCurrentsession之间的差异

时间:2020-02-23 14:34:08  来源:igfitidea点击:

我们可能知道有两种方法可以在Hibernate中创建或者获取会话。
我们在sessionFactory类中有以下两种方法来创建会话。

openSession

当我们调用sessionFactory.opensession时,它始终重新创建新的会话对象并将其交给我们。
我们需要显式刷新并关闭这些会话对象。
随着会话对象不是线程安全的,我们需要在多线程环境中每个请求创建一个会话对象,也需要在Web应用程序中每个请求的一个会话。

getcurrentsession

当我们调用SessionFactory时。
GetCurrentsession,它将提供我们在Hibernate上下文中的会话对象,并在内部由Hibernate管理。
它符合交易范围。

当我们调用SessionFactory时。
GetCurrentsession,它会创建一个新的会话,如果不存在,否则使用相同的会话在当前的Hibernate上下文中。
它在交易结束时自动刷新和关闭会话,因此我们无需在外部执行。

如果在单线程 环境中使用Hibernate,则可以使用GetCurrentsession,因为它的性能更快,与每次创建新的会话相比。

我们需要将以下属性添加到hibernate.cfg.xml以使用GetCurrentsession方法。

<session-factory>
<!--  Put other elements here -->
<property name="hibernate.current_session_context_class">
          thread
</property>
</session-factory>

如果未配置上述属性,则会收到以下内容。

Exception in thread "main" org.hibernate.HibernateException: No CurrentSessionContext configured!
    at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1012)
    at com.arpit.theitroad.hibernate.HibernateSessionExample.main(HibernateSessionExample.java:14)

Opensession vs getCurrentsession:

让我们总结下表中的Opensession和GetCurrentsession之间的差异

参数Opensesessiongetcurrentsession
会话对象它始终创建新的会话对象它创建一个新的会话,如果不存在,否则使用相同的会话在当前的hibernate上下文
Flush和关闭我们需要明确刷新和关闭会话对象我们不需要刷新和关闭会话对象,它将在内部Hibernate 自动处理
性能在单线程 环境中,它比getCurrentsession 慢在单线程 环境中,它比getopensession 更快
配置我们无需配置任何属性可调用此方法我们需要配置其他属性“hibernate.current_session_context_class ”来调用getCurrentsession方法,否则会抛出异常。