Hibernate SessionFactory
Hibernate SessionFactory是我们通过它获取会话和执行数据库操作的工厂类。
目录[ 隐藏 ]
Hibernate SessionFactory
Hibernate的SessionFactory提供了三种方法,通过它我们可以得到Session对象- 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.journaldev.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.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();
//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的全部内容,它是获取会话对象的不同方法。
转载来源:https://www.journaldev.com/3522/hibernate-sessionfactory