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