Hibernate的load()和get()区别

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

一.得到实体对象的不一样数据库

  // 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以外的值会报错.session

1.能够得到id性能

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

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

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

因此两者比较:session.load():①性能好不会发出SQL语句,可是若是查id以外的值会报错.②报错可控 不会出现NULL对象

                      session.get():①无论你用不用这个对象都会发出SQL语句,因此性能差,可是能够查对象的全部值.  ②报错不可控  查不到对象的话 会报NULL.blog

最后建议:使用createSQLQuery接口,通常的业务逻辑均可以知足. 完美!接口

相关文章
相关标签/搜索