在上一次的文章中,我们通过建立了SessionFactory来开启了一个事务,但是这样的操作有一点不足之处,那就是每次调用某个接口方法时都会重新生成一个SessoinFactory,造成冗余。对此,我们通过使用SessoinFactory的单例模式来实现只生成一个SessoinFactory。
要实现SessoinFactory的单例模式,首先第一波我们要在Hibernate的配置文件中进行配置。
<property name="hibernate.current_session_context_class">thread</property>
在hibernate.cfg.xml中添加如上代码。
之后我们在包内新建一个HibernateUtil类,代码如下:
package cn.itcast.test;
import org.hibernate.HibernateException;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtil {
private static Configuration cfg;
private static SessionFactory sf;
static
{
try {
cfg = new Configuration().configure();
sf = cfg.buildSessionFactory();
} catch (HibernateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static SessionFactory getSessionFactory(){
return sf;
}
}
之后我们将之前的测试类Test中的SessionFactory的调用方法替换为新建的HibernateSingleUtil中的接口方法,如下:
@Test
public void testQueryUserById(){
// TODO Auto-generated method stub
SessionFactory sf = null;
Session session = null;
Transaction ts = null;
try {
sf = HibernateUtil.getSessionFactory();
session = sf.getCurrentSession();
ts = session.beginTransaction();
ORMdemo orm=(ORMdemo)session.get(ORMdemo.class, 1);
//持久化
System.out.println("ID:"+orm.getId()+" Username:"+orm.getUsername()+" Password:"+orm.getPassword());
ts.commit();
} catch (HibernateException e) {
// TODO Auto-generated catch block
if(ts != null)
{
ts.rollback();
}
e.printStackTrace();
}
}
这样我们就可以通过HibernateUtil将所有的SessionFactory的生成方法封装到一起,实现了SessionFactory的单例模式使用。