• Hibernate核心开发接口_SessionFactory详解


    SessionFactory:

      a)  用来产生和管理Session

      b)通常情况下每个应用只需要一个SessionFactory

      c)除非要访问多个数据库的情况

      d) 关注两个方法即:  openSession    和 getCurrentSession

         i.   openSession 每次都是新的,需要close

         ii.  getCurrentSession 从上下文找,如果有,用旧的,如果没有,建新的

             1,用途,界定事务边界

             2,事务提交自动close

             3,跟current_session_context_class (JTA、thread) 有关系 

                a)thread 使用 connection

    注:上下文是什么?当前session运行的上下文,在hibernate.cfg.xml里指定的:

        最常用的就是thread,看当前的线程里有没有session对象,有了就拿,没有就建新的。

    <!-- Enable Hibernate's automatic session context management -->
      <property name="current_session_context_class">thread</property>

    SessionFactory怎么理解?

    SessionFactory,产生session的工厂。一般情况下,每一个session里都有一个数据库的连接,(如果没有数据库连接,怎么和数据库打交道呢?)所以产生session的工厂里边一定有好多个数据库连接,所以SessionFactory维护的最重要的东西就是数据库连接池。当它产生一个session的时候,他会从数据库连接池拿出一个连接交给session。

    package com.oracle.hibernate.id;
    
    import org.hibernate.HibernateException;
    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.cfg.AnnotationConfiguration;
    import org.hibernate.cfg.Configuration;
    import org.junit.AfterClass;
    import org.junit.BeforeClass;
    import org.junit.Test;
    
    public class HibernateCoreAPITest {
    
        private static SessionFactory sf = null;
    
        @BeforeClass
        public static void beforeClass() {
            //try-chatch是为了解决Junit有错误不提示的bug
            try {
                /**
                 * AnnotationConfiguration().configure()会默认找src下的hibernate.cfg.xml,读取配置信息。
                 * 最主要的是数据库连接信息,帮你做出连接池。SessionFactory代表着跟数据库的连接
                 * configure()有个重载方法configure(String url)可以指定文件名;如果配置文件叫hibernate.xml,
                 * 就configure("hibernate.xml"),默认去classpath下找配置文件
                 */
                sf = new AnnotationConfiguration().configure().buildSessionFactory();
            } catch (HibernateException e) {
                
                e.printStackTrace();
            }
        }
    
       
        @Test
        public void testTeacher() {
    
            
            Teacher  t  = new Teacher();
            
            t.setName("li");
            
            t.setTitle("high");
            /**
             * getCurrentSession():
             *1, 如果当前上下文有session,就拿来当前的session。如果没有,就创建一个新的session
             * 2,不写session.close();
             * 注意:当session  commit()提交的时候自动close(),写了会报错。
             * 提交同时也会关闭当前session,上下文将不存在该session,此时getCurrentSession()就会创建一个新的session。
             */
            Session session = sf.getCurrentSession();
            
            /**
             * session有个connection方法,返回值也是Connection,可以看出在这个session里绑定了一个Connection,
             * 这个Connection是从SessionFactory通过配置文件信息,产生的数据库连接池里取出的。所以简单理解,session等
             * 同于一个Connection,不过也不能这个理解,hibernate还有很多很复杂的东西。
             */
            //session.connection();
            
             //openSession(),永远都打开新的session。需要close();
            //Session session = sf.openSession();
            
            session.beginTransaction();
            session.save(t);
            
            //当当前的session提交了,就关闭了,对象就没了。再getCurrentSession就是新的。
            //session.getTransaction().commit();
            //session.close();
            
            
            //Session session2 = sf.openSession();
            //两次opSession不是一个session,返回false
            //System.out.println(session == session2);
            
            //Session  session2 = sf.getCurrentSession();
            //如果session没commit,返回true,否则返回false
            //System.out.println(session == session2);
    
        }
        @AfterClass
        public static void afterClass() {
            sf.close();
        }
    
    }
  • 相关阅读:
    地图校正方法心得
    投影的心得点滴
    android 打包 apk keystore
    scp命令详解
    ubuntu11.10真机调试nopermissions
    android adb server is out of date
    ubuntu删除默认jdk
    android 运行 错误 总结
    android file .apk is not a valid zip file adb install
    ubuntu系统目录结构
  • 原文地址:https://www.cnblogs.com/lihaoyang/p/4853712.html
Copyright © 2020-2023  润新知