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接口,一般的业务逻辑都可以满足. 完美!

  • 相关阅读:
    Atitit. C#.net clr 2.0 4.0 4.5新特性 v2 s22 1. CLR内部结构 1 2. CLR 版本发展史 3 3. CLR 2.0新特性 4 4. CLR 4 新特性
    Hbase基本命令 悟寰轩
    mvn常用命令 悟寰轩
    linux添加tomcat服务 悟寰轩
    hadoop基本命令 悟寰轩
    Tomcat启动 悟寰轩
    Eclipse自动部署项目到Tomcat的webapps下的有效方法 悟寰轩
    MySQL改变默认编码为utf8 悟寰轩
    myeclipse关闭自动更新 悟寰轩
    Linux命令大全 悟寰轩
  • 原文地址:https://www.cnblogs.com/daweige/p/8028426.html
Copyright © 2011-2022 走看看