• 08-session详解


    如何获取session对象?

    1,openSession

    2,getCurrentSession

    如果使用getCurrentSession需要在hibernate.cfg.xml文件中进行配置:

    如果是本地事务(JDBC事务)

    <property="hibernate.current_session_context_class">thread</property>

    如果是全局事务(jta事务)

    <property="hibernate.current_session_context_class">jta</property>

    测试代码:

    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
    import org.hibernate.cfg.Configuration;
    import org.hibernate.service.ServiceRegistry;
    import org.junit.Test;
    
    public class SessionTest {
        @Test
        public void testOpenSession()
        {
            Configuration config=new Configuration().configure();//获得配置对象
            config.addClass(Students.class);
            //获得服务注册对象。
            ServiceRegistry serviceRegistry=new StandardServiceRegistryBuilder()
                    .applySettings(config.getProperties()).build(); //通过config.getProperties()读取配置文档。
            //创建会话工厂对象
            SessionFactory sessionFactory=config.buildSessionFactory(serviceRegistry);
            Session session=sessionFactory.openSession();//创建会话对象
            if(session!=null)
            {
                System.out.println("session创建成功");
            }
            else
            {
                System.out.println("创建失败");
            }
            
        }
        @Test
        public void testGetCurrentSession()
        {
            Configuration config=new Configuration().configure();//获得配置对象
            config.addClass(Students.class);
            //获得服务注册对象。
            ServiceRegistry serviceRegistry=new StandardServiceRegistryBuilder()
                    .applySettings(config.getProperties()).build(); //通过config.getProperties()读取配置文档。
            //创建会话工厂对象
            SessionFactory sessionFactory=config.buildSessionFactory(serviceRegistry);
            Session session=sessionFactory.getCurrentSession();//创建会话对象
            if(session!=null)
            {
                System.out.println("session创建成功");
            }
            else
            {
                System.out.println("创建失败");
            }
        }
    }

    运行后发现:一个运行成功,而另一个失败,是因为没有添加配置。

    加上如下后,创建成功:

    二者区别:

    openSession与getCurrentSession区别

    1,getCurrentSession在事务提交或者回滚后会自动关闭,而opensession需要手动关闭。如果使用openssesion而没有手动关闭,

    多次之后会导致连接池溢出

    2,openSession每次创建使用新的session对象,getcurrentSession使用现有的session对象(类似单例模式)。

    验证getCurrentSession每次重新创建对象:

    import org.hibernate.Session;
    import org.hibernate.SessionFactory;
    import org.hibernate.Transaction;
    import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
    import org.hibernate.cfg.Configuration;
    import org.hibernate.service.ServiceRegistry;
    import org.junit.Test;
    
    public class SessionTest {
        @Test
        public void testOpenSession()
        {
            Configuration config=new Configuration().configure();//获得配置对象
            config.addClass(Students.class);
            //获得服务注册对象。
            ServiceRegistry serviceRegistry=new StandardServiceRegistryBuilder()
                    .applySettings(config.getProperties()).build(); //通过config.getProperties()读取配置文档。
            //创建会话工厂对象
            SessionFactory sessionFactory=config.buildSessionFactory(serviceRegistry);
            Session session1=sessionFactory.openSession();//创建会话对象
            Session session2=sessionFactory.openSession();//创建会话对象
            System.out.println(session1==session2);
            /*
            if(session!=null)
            {
                System.out.println("session创建成功");
            }
            else
            {
                System.out.println("创建失败");
            }
            */
        }
        @Test
        public void testGetCurrentSession()
        {
            Configuration config=new Configuration().configure();//获得配置对象
            config.addClass(Students.class);
            //获得服务注册对象。
            ServiceRegistry serviceRegistry=new StandardServiceRegistryBuilder()
                    .applySettings(config.getProperties()).build(); //通过config.getProperties()读取配置文档。
            //创建会话工厂对象
            SessionFactory sessionFactory=config.buildSessionFactory(serviceRegistry);
            Session session1=sessionFactory.getCurrentSession();//创建会话对象
            Session session2=sessionFactory.getCurrentSession();//创建会话对象
            System.out.println(session1==session2);
            /*
            if(session!=null)
            {
                System.out.println("session创建成功");
            }
            else
            {
                System.out.println("创建失败");
            }
            */
        }
        
    }

    结果:false     true

    hbm配置文件常用设置

    <hibernate-mapping>

      schema="schemaName"  //模式名

      catelog="catelogName"  //可以设置目录名称

      default-cascade="cascade_style"  //级联风格

      default-access="filed|property|ClassName"  //访问策略

      default-lazy="true|false"   //加载策略

      package="packagename"  

    />

    <class

      name="ClassName"  //对象关系映射的类

      table="tableName"  //类所映射数据库中对应的表

      batch-size="N"    //抓取策略,每次抓取多少条数据

      where="condition"  //抓取数据的条件

      entity-name="EntityName"  //支持多个映射,同一个实体类可以映射成多个表

    />

    <id  //表示一个表的主键

      name="propertyName"  //主键要映射类的属性

      type="typename"  //数据类型

      column="column_name"  //映射到数据库中字段名

      length="length"  //指定长度

      <generator class="generatorClass"/>  //主键生成策略

    </id>

     主键生成策略

    increment  自动递增

    identity  由底层数据库生成

    sequence  根据地底层数据库的序列生成标识符,要求底层数据库支持序列

    hilo  分局high/low算法生成标识符

    seqhilo  使用高/低算法的生成long,short或者int类型标识符

    native  根据底层数据库对标识符生成标识符方式,自动选择identity,sequence或者hilo

    uuid.hex  采用128为的uuid算法生成标识符

    uuid.string  uuid被编码成一个16字符长的字符串

    assigned  适用自然主键,由java程序负责生成标识符

    foreign  使用另外一个相关联对象的标识符。

  • 相关阅读:
    HTML+CSS基础
    学习C++——实践者的方法(转整)
    招聘要求看技术发展
    笔记本自建无线wifi
    sortAlgorithms
    耐得住寂寞,拥得了繁华
    C++函数重载实现原理浅析
    程序员指南
    tf.image.non_max_suppression()
    函数 不定长参数
  • 原文地址:https://www.cnblogs.com/alsf/p/7820418.html
Copyright © 2020-2023  润新知