代码:
package cn.jbit.common;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.classic.Session;
public class HibernateUtil {
//单例化HibernateUtil
public final static HibernateUtil hibernateUtil=new HibernateUtil();
//hibernate.cfg.xml的地址
public String path;
//configuration的单例,配置文件更改后configuration是不变的,需要重新new一个对象
private Configuration configuration;
//私有化构造函数
private HibernateUtil(){}
//单例创建Configuration
private SessionFactory sessionFactory;
private Configuration Configuration(String path){
if(configuration==null){
configuration=new Configuration().configure(path);
}
return configuration;
}
//创建sessionFactory
private SessionFactory Factory(){
if(sessionFactory==null){
sessionFactory=Configuration(path).buildSessionFactory();
}
return sessionFactory;
}
public Session getCurrentSession(){
return Factory().getCurrentSession();
}
}
创建会话关键类的作用:
Configuration这个来主要是加载配置信息的,将你的hibernate.cfg.xml中的信息加载进去。
SessionFactory是创建Session用的,一般来讲一个数据库对应一个SessionFactory就够了。有的项目可能涉及多个数据库,每个数据库对应一个SessionFactory即可。还记得在hibernate.cfg.xml中配置的<session-factory/>节点吗?SessionFactory就是用来初始化这个的。当然你也可以创建多个SessionFactory来应对你在配置文件中的多个<session-factory/>。
Session会话,嗯这个可和HTTP的会话不同,这里的会话主要是和数据库进行一次交互,这其中还包括了许多数据库操作。另外如果你进行数据库更改的化你还要开启事务以确保你错误的信息不会提交上去。
每个线程首次执session.getCurrentSession()方法都会创建一个Session,而后每个session.getCurrentSession()方法得到的Session对象在同一个线程中是相同,但Session是非线程安全的,也就是说不同线程的Session会话不同。每次操作完成都需要关闭Session。
但如果你配置了以下配置,就不需要了。
如果在Hibernate配置文件中将参数current_session_context_class设置为Thread并采用SessionFactory的getCurrentSession()方法获得Session对象,则不需要执行session.close()方法,通过这种方式获取得到的Session对象,会在关联的事务结束(提交或回滚)后自动关闭。
===========================以上帮助类并非线程安全的,也并非最终版,仅供参考============================