Hibernate中get和load的区别

来源:互联网 发布:linux的进程调度策略 编辑:程序博客网 时间:2024/05/01 12:15

 当对象.hbm.xml配置文件<class>元素的lazy属性设置为true时,调用load()方法时则返回持久对象的代理类实例,此时的代理类实例是由运行时动态生成的类,该代理类实例包括原目标对象的所有属性和方法,该代理类实例的属性除了ID不为null外,所在属性为null值,查看日志并没有Hibernate SQL输出,说明没有执行查询操作,当代理类实例通过getXXX()方法获取属性值时,Hiberante才真正执行数据库查询操作;当对象.hbm.xml配置文件<class>元素的lazy属性设置为false时,调用load()方法则是立即执行数据库并直接返回实体类,并不返回代理类。而调用get()方法时不管lazy为何值,都直接返回实体类。

 

总结:

lazy=true;load方式返回代理类实例,此时要用到的时候才去执行数据库的查询操作

lazy=false;load方式直接查询数据库,返回实体

get方式不管任何情况都是直接返回实体类。

 

其实get方式查找的顺序是:  session缓存-->二级缓存-->数据库

1. 对于get方法,hibernate会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在二级缓存中查找,还没有就查询数据库,数据库中没有就返回null。这个相对比较简单,也没有太大的争议。主要要说明的一点就是在这个版本中get方法也会查找二级缓存!


load方式的查找顺序是:

1:lazy=true      Session缓存-->在使用的时候才去查找二级缓存和数据库

2:lazy=false     session缓存-->二级缓存-->数据库

 

总之对于get和load的根本区别,一句话,hibernate对于load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,只能抛异常;而对于get方法,hibernate一定要获取到真实的数据,否则返回null。

 

所以对于不愿意进行异常处理的时候,你最好是选择不延迟加载,或则采用get的方式!

原创粉丝点击