Hibernate学习之SessionFactory

由于SessionFactory是一个重量级的类,在一个应用中我们需要做成单例的,我选择的做法是: `

            import org.hibernate.SessionFactory;
            import org.hibernate.cfg.Configuration;             
            final public class Utils {

                private static SessionFactory  sessionFactory=null;                 
                static{
                    //创建SessionFactory会话工厂
                    sessionFactory=new Configuration().configure().buildSessionFactory();
                }                   
                private Utils(){                    
                }

                public static SessionFactory geSessionFactory(){
                    return sessionFactory;
                }
            }
            `

这样就可以在需要的地方直接调用

      SessionFactory factory=Utils.geSessionFactory();

        Session  s1=factory.openSession();
        Session  s3=factory.getCurrentSession();

openSession()是打开一个Session,因此每次得到的Session都不一样

getCurrentSession()是得到当前线程的一个Session,在一个thread中使用该方法得到的Session都是同一个Session
但是在使用getCurrentSession()前需要在hibernate.cfg.xml中做如下配置:

                <!-- java程序  -->
        <property name="current_session_context_class">thread</property>
                <!--  web程序 -->
        <property name="current_session_context_class">jta</property>

否则会报如下错误: No CurrentSessionContext configured! <br />

   在使用getCurrentSession()得到的session做查询操作(load())时需要使用事务,否则

会报如下错误:

      Exception in thread "main" org.hibernate.HibernateException: load is not valid without active transaction

而且这个session是自动关闭的

        使用load()查询时,如果查询不到,则会返回null,   load()使用一种代理机制,如果不使用查询得到的对象,则不会执行SQL语句,只有使用对象时才会执行SQL语句  【懒加载】

        get()查询,如果查询不到,则会抛出异常,且在查询时就执行SQL语句,不管查询的结果会不会使用

你可能感兴趣的:(Hibernate学习之SessionFactory)