hibernate加载对象(get和load的区别)

来源:互联网 发布:淘宝免单怎么设置 编辑:程序博客网 时间:2024/05/18 17:41

在hibernate中我们知道如果要从数据库中得到一个对象,通常有两种方式:

通过session.get()方法和通过session.load()方法,然后其实这两种方法在获得一个实体对象时是有区别的,在查询性能上两者是不同的。

一、load加载方式

当使用load方法来得到一个对象时,会使用延迟加载的机制来加载这个对象。如果对象不存在,则会抛出ObjectNotFoundException异常。

即:当我们使用session.load()方法来加载一个对象时,此时并不会发出sql语句,当前得到的这个对象其实是一个代理对象,这个代理对象只保存了实体对象的id值,只有当我们要使用这个对象,得到其它属性时,这个时候才会发出sql语句,从数据库中去查询我们的对象

二、get加载方式

相对于load的延迟加载方式,get就直接的多,当我们使用session.get()方法来得到一个对象时,不管我们使不使用这个对象,此时都会发出sql语句去从数据库中查询出来。如果数据库中没有,则返回null。

总结:

如果使用get方法,hibernate会去确认该id对应的数据是否存在,它首先会去session中去查询(session缓存其实就hibernate的一级缓存),如果没有,再去二级缓存中去查询,如果再没有,就去数据库中查询,仍然没有找到的话,就返回null。

使用load方法的话,hibernate会认定该id对应的数据一定存在,它也会先去session缓存中去查找,如果没有找到,hibernate会根据配置对象的lazy属性值来确定是否使用延迟加载。如果lazy=‘true’ ,就使用延迟加载,返回该代理对象,等到真正访问到该对象的属性时才会去二级缓存中查询,如果没有,再去数据库中查询,如果还没有,就抛出org.hibernate.ObjectNotFoundException异常。如果lazy='false' 则不使用延迟加载,这是load的访问机制就和get一样了。

ps:当明确知道数据库中有user对象时,建议使用load方法,因为代理模式可以提高效率; 

如果不确定是否有user对象时,可以用get方法来判断是否为null。

0 0
原创粉丝点击