在Hibernate中我们知道如果要从数据库中得到一个对象,通常有两种方式,一种是通过session.get()方法,另一种就是通过session.load()方法,然后其实这两种方法在获得一个实体对象时是有区别的,在查询性能上两者是不同的。
一、load方法
当使用load方法来得到一个对象时,此时hibernate会使用延迟加载的机制来加载这个对象,即:当我们使用session.load()方法来加载一个对象时,此时并不会发出sql语句,当前得到的这个对象其实是一个代理对象,这个代理对象只保存了实体对象的id值,只有当我们要使用这个对象,得到其它属性时,这个时候才会发出sql语句,从数据库中去查询我们的对象。
我们可以看到,如果我们仅仅是通过load来加载我们的User对象,此时从控制台我们会发现并不会从数据库中查询出该对象,即并不会发出sql语句,但如果我们要使用该对象属性时:
此时在控制台就会打印出sql语句,并会将该对象从数据库中查询出来:
当在数据库表中查不到数据的时候,就会抛出”对象找不到”异常,而不是空指针异常:
二、get方法
相对于load的延迟加载方式,get就直接的多,当我们使用session.get()方法来得到一个对象时,不管我们使不使用这个对象,此时都会发出sql语句去从数据库中查询出来:
此时我们通过get方式来得到user对象,但是我们并没有使用它,但控制台会输出sql的查询语句:
当在数据库表中查询不出结果的时候,会返回一个null:
三、总结
load为延迟加载,get为及时加载,都是通过id去找数据,load是到缓存里面去找id,如果缓存没有,再到数据库里面找。当你不使用实体的属性时,它是不会去找的。
get是马上就去数据库里面找,不管你用不用。
由此可以看出,load加载的优势,当表的数据量大的时候,不建议一来就把数据库里面的内容加载出来。