Hibernate SessionFactory

Hibernate SessionFactory

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

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.journaldev.hibernate.main.HibernateSessionExample.main(HibernateSessionExample.java:16)

由于此会话对象属于Hibernate上下文,我们不需要关闭它。一旦会话工厂关闭,此会话对象就会关闭。Hibernate会话对象不是线程安全的,因此我们不应该在多线程环境中使用它。我们可以在单线程环境中使用它,因为相对于打开新会话,它的速度要快一些。

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.journaldev.hibernate.main;

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

import com.journaldev.hibernate.util.HibernateUtil;

public class HibernateSessionExample {

	public static void main(String[] args) {
		
		SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
		
		//当前会话 - 无需关闭
		Session currentSession = sessionFactory.getCurrentSession();
		
		//打开新会话
		Session newSession = sessionFactory.openSession();
		//执行数据库操作
		
		//关闭会话
		newSession.close();
		
		//打开无状态会话
		StatelessSession statelessSession = sessionFactory.openStatelessSession();
		//执行无状态数据库操作
		
		//关闭会话
		statelessSession.close();
		
		//关闭会话 factory
		sessionFactory.close();
		
	}

}

以上就是Hibernate中SessionFactory及其获取会话对象的不同方法。

Source:
https://www.digitalocean.com/community/tutorials/hibernate-sessionfactory