• Hibernate检索策略


    一、Hibernate的检索策略分类

      1、立即检索

         立即查询方式,调用get方法只会,会马上去查询数据库。

    public void Test2(){
                SessionFactory sessionFactory = null;
                Session session = null;
                Transaction tx = null;
                try {
                    sessionFactory = HibernateUtils.getFactory();
                    session = sessionFactory.openSession();
                    tx = session.beginTransaction();
                    //调用get方法查询出一条记录,调用只后会马上发送sql语句去查询数据库
                    Sort food = session.get(Sort.class, 1);
                    System.out.println(food);
                    tx.commit();
                } catch (Exception e) {
                    tx.rollback();
                }finally{
                    session.close();
                    sessionFactory.close();
                }
            }

      2、延迟检索

         延迟查询方式,使用session对象的load方法查询时,调用load方法后不会立即查询数据库,

        而是等需要得到该查询对象里面的属性的时候才会去查询数据库。

        @Test
                    
                    public void Test13(){
                        SessionFactory sessionFactory = null;
                        Session session = null;
                        Transaction tx = null;
                        try {
                            sessionFactory = HibernateUtils.getFactory();
                            session = sessionFactory.openSession();
                            tx = session.beginTransaction();
                            //调用get方法查询出一条记录,调用只后不会会马上发送sql语句去查询数据库
                            Sort food = session.load(Sort.class, 1);
                            //不发送SQL语句,返回的对象里面只有id值
                            System.out.println(food.getSid());
                            //发送SQL语句,查询数据库
                            System.out.println(food.getSname());
                            tx.commit();
                        } catch (Exception e) {
                            tx.rollback();
                        }finally{
                            session.close();
                            sessionFactory.close();
                        }
                    }

    二、延迟检索分类

      1、类级别的延迟

          延迟查询方式,使用session对象的load方法查询时,调用load方法后不会立即查询数据库,

        而是等需要得到该查询对象里面的属性的时候才会去查询数据库。

        @Test
                    
                    public void Test13(){
                        SessionFactory sessionFactory = null;
                        Session session = null;
                        Transaction tx = null;
                        try {
                            sessionFactory = HibernateUtils.getFactory();
                            session = sessionFactory.openSession();
                            tx = session.beginTransaction();
                            //调用get方法查询出一条记录,调用只后不会会马上发送sql语句去查询数据库
                            Sort food = session.load(Sort.class, 1);
                            //不发送SQL语句,返回的对象里面只有id值
                            System.out.println(food.getSid());
                            //发送SQL语句,查询数据库
                            System.out.println(food.getSname());
                            tx.commit();
                        } catch (Exception e) {
                            tx.rollback();
                        }finally{
                            session.close();
                            sessionFactory.close();
                        }
                    }

      2、关联级别延迟

        查询某个类别,再查询这个类别的所有商品,查询类别的所有商品的过程是否需要延迟,这个过程称为关联级别延迟。

        

    @Test
        
        public void Test1(){
            SessionFactory sessionFactory = null;
            Session session = null;
            Transaction tx = null;
            try {
                sessionFactory = HibernateUtils.getFactory();
                session = sessionFactory.openSession();
                tx = session.beginTransaction();
                //1、使用get方法查询出食品类
                Sort food = session.get(Sort.class, 1);
                //2、使用sort对象的方法得到所有食品类中的食品,没有发送SQL语句
                Set<Good> set = food.getSetGoods();
                //3、发送SQL语句
                System.out.println(set.size());
                tx.commit();
            } catch (Exception e) {
                tx.rollback();
            }finally{
                session.close();
                sessionFactory.close();
            }
        }

    三、关联级别延迟操作

       1 在映射文件中进行配置实现

        (1)根据类别得到所有的商品,在类别映射文件中配置

       2 在set标签上使用属性

        (1)fetch:值select(默认)

        (2)lazy:值

            - true:延迟(默认)

            - false:不延迟

            - extra:极其延迟

        (3)延迟效果

          默认延迟效果:

    @Test
        
        public void Test1(){
            SessionFactory sessionFactory = null;
            Session session = null;
            Transaction tx = null;
            try {
                sessionFactory = HibernateUtils.getFactory();
                session = sessionFactory.openSession();
                tx = session.beginTransaction();
                //1、使用get方法查询出食品类
                Sort food = session.get(Sort.class, 1);
                //2、使用sort对象的方法得到所有食品类中的食品,发送SQL语句
                Set<Good> set = food.getSetGoods();
                //3、发送SQL语句
                System.out.println(set.size());
                tx.commit();
            } catch (Exception e) {
                tx.rollback();
            }finally{
                session.close();
                sessionFactory.close();
            }
        }

        不延迟效果

    @Test
        
        public void Test1(){
            SessionFactory sessionFactory = null;
            Session session = null;
            Transaction tx = null;
            try {
                sessionFactory = HibernateUtils.getFactory();
                session = sessionFactory.openSession();
                tx = session.beginTransaction();
                //1、使用get方法查询出食品类
                Sort food = session.get(Sort.class, 1);
                //2、使用sort对象的方法得到所有食品类中的食品,没有发送SQL语句
                Set<Good> set = food.getSetGoods();
                //3、发送SQL语句
                System.out.println(set.size());
                tx.commit();
            } catch (Exception e) {
                tx.rollback();
            }finally{
                session.close();
                sessionFactory.close();
            }
        }

           极度延迟效果:

        

    @Test
        
        public void Test1(){
            SessionFactory sessionFactory = null;
            Session session = null;
            Transaction tx = null;
            try {
                sessionFactory = HibernateUtils.getFactory();
                session = sessionFactory.openSession();
                tx = session.beginTransaction();
                //1、使用get方法查询出食品类
                Sort food = session.get(Sort.class, 1);
                //2、使用sort对象的方法得到所有食品类中的食品,没有发送SQL语句
                Set<Good> set = food.getSetGoods();
                //3、发送SQL语句,但发送的查询数量的count聚集函数语句
                System.out.println(set.size());
                tx.commit();
            } catch (Exception e) {
                tx.rollback();
            }finally{
                session.close();
                sessionFactory.close();
            }
        }

            

  • 相关阅读:
    交叉编译GDB
    交叉编译Python
    DEBUG memory问题的一些工具以及注意事项
    [qemu] QEMU虚拟机的安装步骤
    分享一个public domain 的大数运算库,可以用于RSA加密解密
    [KERNEL] 在procfs中新增文件的方法
    [backtrace]在不改变代码的情况下,打印可执行文件的backtrace
    【幻化万千戏红尘】qianfeng-JAVA课程结束总结
    【幻化万千戏红尘】qianfengDay30-正则表达式、注解注释基础学习:
    【幻化万千戏红尘】qianfengDay29-Json解析、Gson解析、FASTJSON解析基础学习:
  • 原文地址:https://www.cnblogs.com/jack1995/p/6953394.html
Copyright © 2020-2023  润新知