学习hibernate3——SessionFactory的搭建

本期项目的云盘地址:链接:http://pan.baidu.com/s/1jI750Vk 密码:9vgi
ps:关于hibernate的所有学习过程中的所有共享文件都在这个链接里面,我会不断更新的。


在上一次的项目中我们会发现,我们是每一个方法里面都必须去创建一个SessionFactory,然后通过SessionFactory去获取一个Session,这其实是一件一直在重复做的事情,我们完全可以考虑把这部分的代码封装起来,之后需要调用的时候直接调用就可以,不需要再去写一堆创建SessionFactory的代码


代码部分主要在com.h4这个包里面的HibernateSessionFactory.java
第一部分是一个静态的代码块

//静态代码块,程序一启动就会执行的代码
static{
    try {
        //读取配置文件hibernate.cfg.xml
        configuration.configure();
        //生成一个注册机对象
        ServiceRegistry serviceRegistry = 
                new ServiceRegistryBuilder()
                .applySettings(configuration.getProperties())
                .buildServiceRegistry();
        //使用注册机对象serviceRegistry创建sessionFactory
        sessionFactory = configuration.
                buildSessionFactory(serviceRegistry);
    } catch (HibernateException e) {
        e.printStackTrace();
    }
}   

静态代码块跟静态方法不同,不需要通过类名去显性调用,也不需要new一个对象调用,在类启动的时候自动调用该方法。
hibernate4.x之前,SessionFactory是直接使用一个configuration对象调用buildSessionFactory()方法返回一个SessionFactory对象

SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();

但是4.x版本之后,hibernate采用先生成一个serviceRegistry 注册对象,在通过configuration对象的buildSessionFactory方法传入serviceRegistry ,最后返回一个SessionFactory。

//获得Session对象
public static Session getSession(){
    //获取ThreadLocal对象管理的Session对象
    Session session = (Session)sessionThreadLocal.get();
    try {
        //判断Session对象是否已经打开或者是否存在
        if(session == null || !session.isOpen()){
            //如果session对象为空或未打开,再判断SessionFactory对象是否为空
            if (sessionFactory == null) {
                rebuildSessionFactory();
            }
            //如果SessionFactory不为空,则打开session
            session = (sessionFactory != null) ? 
                    sessionFactory.openSession() : null;
            sessionThreadLocal.set(session);
        }
    } catch (HibernateException e) {
        e.printStackTrace();
    }
    return session;
}

获取Session的方法
需要做两个判断,第一是判断session是否为空以及session是否已经被打开

public static void closeSession(){
    Session session = (Session)sessionThreadLocal.get();
    sessionThreadLocal.set(null);
    try {
        if(session != null && session.isOpen()){
            session.close();
        }
    } catch (HibernateException e) {
        e.printStackTrace();
    }
}

关闭Session方法,注意也要判断Session是否为空以及是否打开着。如果Session为空或者未打开,则无需做任何操作。

就先写到这里,主要是封装创建SessionFactory跟获取session以及关闭session的方法。代码跟上一篇文章合并在文件hibernate_2.zip

你可能感兴趣的:(学习hibernate3——SessionFactory的搭建)