zoukankan      html  css  js  c++  java
  • Hibernate的load()和get()区别

    最近在用Hibernate的时候发现一个问题:比如我们从数据库获得一个对象时,使用session.get()方法还是session.load()?  两种方法在获得一个实体对象时是有区别的,在查询性能上两者是不同的。

    一.获得实体对象的不同

    复制代码
      // load方法
    public student GetStudentBystudo(String studo){ student stu = null; Session session = getSession(); if(session != null){ try{ // get如果没有查询到数据,则返回null // stu = (Student) session.get(Student.class, stuNo); stu = (student) session.load(student.class, studo);// load如果没有查询到数据,则抛出异常 }catch(HibernateException e){ e.printStackTrace(); }finally{ session.close(); } }
    复制代码

    load方法是懒加载,,即:当我们使用session.load()方法来加载一个对象时,此时并不会发出sql语句,当前得到的这个对象其实是一个代理对象,这个代理对象只保存了实体对象的id值,只有当我们要使用这个对象,得到其它属性时,这个时候才会发出sql语句,从数据库中去查询我们的对象。
    这就造成在实际的运行中,如果想要获得id之外的值会报错.

    1.可以获得id

    2.获取这个对象的其他值会报错

    这里的原因在上面已经说了,session.load()不会发出SQL语句,且只会得到对象的一个id值.

    相比之下session.get()方法就比较直接,当我们使用session.get()方法来得到一个对象时,不管我们使不使用这个对象,此时都会发出sql语句去从数据库中查询出来.

    所以二者比较:session.load():①性能好不会发出SQL语句,但是如果查id之外的值会报错.②报错可控 不会出现NULL

                          session.get():①不管你用不用这个对象都会发出SQL语句,所以性能差,但是可以查对象的所有值.  ②报错不可控  查不到对象的话 会报NULL.

    最后建议:使用createSQLQuery接口,一般的业务逻辑都可以满足. 完美!

  • 相关阅读:
    java输出菱型
    java----内部类
    java中的多重继承
    java算法--三个数字比较大小
    Python基础(2)
    Python基础(1)
    Redis主从同步
    一种高效的进程间的通信方式
    自旋锁和互斥锁的区别
    Linux读写锁的使用
  • 原文地址:https://www.cnblogs.com/dudadi/p/8029768.html
Copyright © 2011-2022 走看看