Hibernate SessionFactory是一个工厂类,我们通过它获得会话并执行数据库操作。
休眠SessionFactory
Hibernate SessionFactory提供了三种获取Session对象的方法--
getCurrentSession()
、OpenSession()
和OpenStatelessSession()
。
Hibernate SessionFactory获取当前会话
Hibernate SessionFactory
getCurrentSession()方法返回绑定到上下文的会话。但是为了让它工作,我们需要在hibernate配置文件中配置它,如下所示。
1<property name="hibernate.current_session_context_class">thread</property>
如果它没有配置为线程,那么我们将得到以下异常。
1Exception in thread "main" org.hibernate.HibernateException: No CurrentSessionContext configured!
2 at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1012)
3 at com.journaldev.hibernate.main.HibernateSessionExample.main(HibernateSessionExample.java:16)
因为这个会话对象属于Hibernate上下文,所以我们不需要关闭它。会话工厂关闭后,此会话对象也将关闭。Hibernate会话对象不是线程安全的,所以我们不应该在多线程环境中使用它。我们可以在单线程环境中使用它,因为它比打开一个新会话要快得多。
休眠SessionFactory OpenSession
HibernateSessionFactory
OpenSession()方法总是打开一个新的会话。一旦完成了所有的数据库操作,我们就应该关闭这个会话对象。在多线程环境中,我们应该为每个请求打开一个新的会话。对于Web应用框架,我们可以选择为每个请求打开一个新会话,或者根据需求为每个会话打开一个新会话。
休眠SessionFactory OpenStatelessSession
Hibernate SessionFactory
openStatelessSession()方法返回StatelessSession
的实例。还有另一个重载的方法,我们可以通过java.sql.Connection
对象从hibernate获取一个无状态的会话对象。Hibernate中的StatelessSession不实现一级缓存,也不与任何二级缓存交互。因为它是无状态的,所以它不实现事务性的write-behind或自动脏检查,也不对关联的实体进行级联操作。无状态会话也会忽略集合。通过无状态会话执行的操作绕过Hibernate的事件模型和拦截器。它更像是一个普通的JDBC连接,并不提供使用Hibernate框架所带来的任何好处。然而,在某些情况下,无状态会话可能是一个很好的选择。例如,当我们将大量数据加载到数据库中时,我们不希望hibernate会话在一级缓存中保存大量数据。下面给出了一个简单的程序来展示Hibernate SessionFactory方法的用法。
1package com.journaldev.hibernate.main;
2
3import org.hibernate.Session;
4import org.hibernate.SessionFactory;
5import org.hibernate.StatelessSession;
6
7import com.journaldev.hibernate.util.HibernateUtil;
8
9public class HibernateSessionExample {
10
11 public static void main(String[] args) {
12
13 SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
14
15 //Current Session - no need to close
16 Session currentSession = sessionFactory.getCurrentSession();
17
18 //open new session
19 Session newSession = sessionFactory.openSession();
20 //perform db operations
21
22 //close session
23 newSession.close();
24
25 //open stateless session
26 StatelessSession statelessSession = sessionFactory.openStatelessSession();
27 //perform stateless db operations
28
29 //close session
30 statelessSession.close();
31
32 //close session factory
33 sessionFactory.close();
34
35 }
36
37}
这就是Hibernate中SessionFactory的全部内容,获取会话对象的方法也不同。