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

