在Hibernate中SessionFactory的获取和Session获取的代码如下:
package com.xingguo.util;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.hibernate.service.ServiceRegistryBuilder;
public class SessionFactoryUtil {
private SessionFactoryUtil(){}
private static SessionFactory sessionFactory = buildSessionFactory();
private static SessionFactory buildSessionFactory() {
Configuration config = new Configuration().configure();
ServiceRegistry serviceRegistry = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
return config.buildSessionFactory(serviceRegistry);
}
public static SessionFactory getSessionFactory(){
return sessionFactory;
}
public static Session getSession(){
return getSessionFactory().getCurrentSession();
}
}
- 其中Configuration config = new Configuration().configure(); 是读取默认的hibernate.cfg.xml的文件。
- 在最新的Hibernate中config.buildSessionFactory()这个方法已经被废弃。推荐使用的就是上面利用ServiceRegistry接口。
- 其中获取Session推荐使用getCurrentSession()方法,而不推荐使用openSession()方法。
ServiceRegistry 是 Service 的注册表, 它为Service提供了一个统一的加载 / 初始化 / 存放 / 获取机制。
使用getCurrentSession要在配置文件hibernate.cfg.xml里进行如下设置
如果使用的是本地事务(jdbc事务)
<property name="hibernate.current_session_context_class">thread</property>
如果使用的是全局事务(jta事务)
<property name="hibernate.current_session_context_class">jta</property>