• 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  使用另外一个相关联对象的标识符。

  • 相关阅读:
    笔记20200521002:多线程【线程的优先级】
    笔记20200521001:多线程【守护线程】
    笔记20200520:多线程【线程强制执行_join】
    笔记20200519:多线程【线程礼让_yield】
    笔记20200518:多线程【线程休眠_sleep】
    2020.4.4号全国疫情哀悼日网页变灰色前端是如何实现的?-pink老师
    2020年最新版Web前端学习路线图-前端小白入门必读-pink老师推荐
    ECharts数据可视化项目-大屏数据可视化展示-echarts 图表入门基础视频制作-pink老师直播课更新完毕
    2019前端学习路线心得-黑马程序员pink老师
    2019年最新超级有趣好玩的html+css网页布局课程,前端入门基础,html5+css3零基础入门课程-黑马程序员pink老师精心录制
  • 原文地址:https://www.cnblogs.com/alsf/p/7820418.html
Copyright © 2020-2023  润新知