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