Hibernate在操作数据库时,需要打开配置Hibernate.cfg.xml文件,使用private static Configuration configuration=new Configuration();
configuration.configure();还要获取会话session。Session会话具有线程不安全的特点,因此用本地线程private static ThreadLocal threadLocal=new ThreadLocal();去获取:threadLocal.set(session);
完整代码如下:
// An highlighted block`在这里插入代码片`
package com.my.utils;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtil
{
//初始化Hibernate,创建会话,耗费资源,故在静态代码块中创建。
private static SessionFactory sessionFactory=null;
//为了线程安全
private static ThreadLocal<Session> threadLocal=new ThreadLocal<Session>();
private static Configuration configuration=new Configuration();
static
{
try {
configuration.configure();//查找Hibernate.cfg.xml配置文件
sessionFactory=configuration.buildSessionFactory();
} catch (HibernateException e) {
e.printStackTrace();
}
}
public static SessionFactory getSessionFactory()
{
return sessionFactory;
}
public Session getSession()
{
Session session=threadLocal.get();
if(session==null||!session.isOpen())
{
if(threadLocal==null)
{
rebuildSessionFactory();
}
}
session=(sessionFactory!=null)?sessionFactory.openSession():null;
threadLocal.set(session);
return session;
}
public static void rebuildSessionFactory()
{
try {
configuration.configure();
sessionFactory=configuration.buildSessionFactory();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void closeSession()
{
Session session=threadLocal.get();
threadLocal.remove();
if(session!=null)
{
if(session.isOpen())
{
session.close();
}
}
}
}