Hibernate 会话工厂

时间:2020-02-23 14:41:26  来源:igfitidea点击:

Hibernate SessionFactory是工厂类,通过它我们可以获取会话并执行数据库操作。

Hibernate 会话工厂

Hibernate SessionFactory提供了三种获取会话对象的方法– getCurrentSession(),openSession()和openStatelessSession()。

Hibernate SessionFactory getCurrentSession

Hibernate的" SessionFactory"的getCurrentSession()方法返回绑定到上下文的会话。
但是要使其正常工作,我们需要在Hibernate 配置文件中对其进行配置,如下所示。

<property name="hibernate.current_session_context_class">thread</property>

如果未将其配置为线程,那么我们将获得以下异常。

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

由于此会话对象属于Hibernate 上下文,因此我们无需关闭它。
会话工厂关闭后,此会话对象将关闭。

Hibernate Session对象不是线程安全的,因此我们不应在多线程环境中使用它。
我们可以在单线程环境中使用它,因为它比打开新会话相对要快。

Hibernate SessionFactory openSession

Hibernate 的SessionFactory openSession()方法总是打开一个新的会话。
一旦完成所有数据库操作,就应该关闭该会话对象。

我们应该在多线程环境中为每个请求打开一个新会话。
对于Web应用程序框架,我们可以根据需要选择为每个请求或者每个会话打开一个新会话。

Hibernate SessionFactory openStatelessSession

Hibernate 的SessionFactory openStatelessSession()方法返回StatelessSession的实例。
还有另一个重载方法,我们可以传递java.sql.Connection对象来从Hibernate 中获取无状态会话对象。

Hibernate中的StatelessSession不实现一级缓存,并且不与任何二级缓存交互。
由于它是无状态的,因此不会实现事务后写或者自动脏检查,也不会对关联实体进行级联操作。

无状态会话也会忽略集合。
通过无状态会话执行的操作会绕过Hibernate的事件模型和拦截器。
它更像是普通的JDBC连接,并且不会提供使用Hibernate 框架带来的任何好处。

但是,无状态会话在某些情况下可能非常适合。
例如,当我们将大量数据加载到数据库中时,我们不希望Hibernate 会话将大量数据保存在一级缓存中。

下面给出一个显示Hibernate SessionFactory方法用法的简单程序。

package com.theitroad.hibernate.main;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.StatelessSession;

import com.theitroad.hibernate.util.HibernateUtil;

public class HibernateSessionExample {

	public static void main(String[] args) {
		
		SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
		
		//Current Session - no need to close
		Session currentSession = sessionFactory.getCurrentSession();
		
		//open new session
		Session newSession = sessionFactory.openSession();
		//perform db operations
		
		//close session
		newSession.close();
		
		//open stateless session
		StatelessSession statelessSession = sessionFactory.openStatelessSession();
		//perform stateless db operations
		
		//close session
		statelessSession.close();
		
		//close session factory
		sessionFactory.close();
		
	}

}

Hibernate中的SessionFactory就是这样,而获取会话对象的方法也不同。