• Hibernate框架之get和load方法的区别


           我们在学习Hibernate框架时,经常会进行修改,删除操作,对于这些操作,我们都应该先加载对象,然后在执行或删除的操作,那么这里Hibernate提供了两种方法按照主键加载对象,也就是我要说的get和load这两个方法。

          我们都知道这两个方法都能够去加载对象,但是他们之间的区别我们必须要去了解一下,这可能也会成为面试的重点。下面我们

    主要分析一下get和load这两个方法的区别:

     一.Load加载方式和get加载对象方式的区别:

       1.load加载方式:        

       Hibernate在使用Load方法获取一个对象时,Hibernate会采用延迟加载的机制来加载这个对象。

       我们可以来看一个例子来证明一下:   

    package cn.hyj.Test;
    
    import org.hibernate.Session;
    
    import cn.hyj.entity.User;
    import cn.hyj.util.HibernateUtil;
    
    public class test1 {
      public static void main(String[] args) {
          //实例化一个工具类,主要用户回去session对象
        HibernateUtil hu=new HibernateUtil();
        //通过currentSession获取session对象
        Session session=hu.currentSession();
        //通过load方法加载User对象
        User user=(User)session.load(User.class, new Integer(42));
        System.out.println("没有执行查询的sql");
        }
    }

       我们可以来看一下控制台的效果:

        我们看到,如果我们仅仅是通过load来加载我们的User对象,此时从控制台我们会发现并不会从数据库中查询出该对象,即并不会发出sql语句。

         如果我们在后面要输入这个对象我们可以看到这样一个结果:

    public static void main(String[] args) {
          //实例化一个工具类,主要用户回去session对象
        HibernateUtil hu=new HibernateUtil();
        //通过currentSession获取session对象
        Session session=hu.currentSession();
        //通过load方法加载User对象
        User user=(User)session.load(User.class, new Integer(42));
        System.out.println(user);
      }

    控制台输出结果:

        当你输出user对象的时候,我们可以在控制台看出他会在数据库中将这个对象查询出来。这个时候我们应该产生一个疑问,刚才不是说load方法查询出对象不会发出sql语句,但为什么输出user对象会发出sql语句。这时又要抛出一个概念了,就是代理对象。这个代理对象其实仅仅保存了id这个属性。

         为了证明这个代理对象保存的只有id这个属性我们可以看下面一段案例:

     public static void main(String[] args) {
          //实例化一个工具类,主要用户回去session对象
        HibernateUtil hu=new HibernateUtil();
        //通过currentSession获取session对象
        Session session=hu.currentSession();
        //通过load方法加载User对象
        User user=(User)session.load(User.class, new Integer(42));
        System.out.println(user.getId());
      }

        我们可以看一下如果我查询这个对象的别的属性,那么他会发出sql吗?

     public static void main(String[] args) {
          //实例化一个工具类,主要用户回去session对象
        HibernateUtil hu=new HibernateUtil();
        //通过currentSession获取session对象
        Session session=hu.currentSession();
        //通过load方法加载User对象
        User user=(User)session.load(User.class, new Integer(42));
        System.out.println(user.getName());
      }

    答案可想而只,因为我在上面已经说了,user只不过是一个代理对象,他只保存了id这个属性,所有当你输出user的其他属性值,他会根据这个id到数据库进行查询。

      2.get加载方式

        相对于load的延迟加载方式,get就直接的多,当我们使用session.get()方法来得到一个对象时,不管我们使不使用这个对象,此时都会发出sql语句去从数据库中查询出来。

        

    public static void main(String[] args) {
          //实例化一个工具类,主要用户回去session对象
        HibernateUtil hu=new HibernateUtil();
        //通过currentSession获取session对象
        Session session=hu.currentSession();
        //通过load方法加载User对象
        User user=(User)session.get(User.class, new Integer(42));
      }

    控制台输出结果:

      经过上述的几个案例我们可以看到,使用load的加载方式比get的加载方式性能要好一些,因为load加载时,得到的只是一个代理对象,当真正需要使用这个对象时再去从数据库中查询。

    二.关于get和load方法遇到根据主键查不到数据的区别:

         1.get方式:

        当使用Session中的get方法来获取对象时,如果查询主键为11的用户信息,如果数据库中没有这条信息,则get方法返回的是NULL。

        2.load方式:

        当使用Session中的load方法来获取对象时,如果查询主键为11的用户信息,如果数据库中没有这条信息,则load方法将会抛出异常。

  • 相关阅读:
    setTimeout的时间设为0的问题
    nodejs的简单服务器程序
    使用Promise规定来处理ajax请求的结果
    使用myfocus制作焦点图
    给Array添加删除重复元素函数
    css派生选择器
    Javascript 参数传递
    Node.js 搞Javascript开发的无论如何要尝试一下
    CSS九宫格带边框的多种实现
    80%人会答错的JS基础面试题
  • 原文地址:https://www.cnblogs.com/hyjj/p/5744681.html
Copyright © 2020-2023  润新知