Hibernate中load方法与get方法的区别
主要区别在于是否延迟加载。
load方法
不会立即访问数据库,当试图加载的记录不存在时,load方法返回一个未初始化的代理对象。
get方法
总是立即访问数据库。当试图加载的记录不存在时,直接返回null
在hibernate中发现有2个方法很雷同。查阅后发现
hibernate中有两个极为相似的方法get()与load(),他们都可以通过指定的实体类与id从数据库中读取数据,并返回对应的实例,但hibernate不会搞两个完全一样的方法的,它们间的不同在于:
get是直接查询数据库,如果查不到就返回null ,load会首先从内存中装载,如果以前没有装载或查询出来,才开 始查询数据库.
hibernate中get方法和load方法的根本区别在于:如果你使用load方法,hibernate认为该id对应的对象(数据库记录)在数据库中是一定存在的,所以它可以放心的使用,它可以放心的使用代理来延迟加载该对象。在用到对象中的其他属性数据时才查询数据库,但是万一数据库中不存在该记录,那没办法,只能抛异常,所说的load方法抛异常是指在使用该对象的数据时,数据库中不存在该数据时抛异常,而不是在创建这个对象时。由于session中的缓存对于hibernate来说是个相当廉价的资源,所以在load时会先查一下session缓存看看该id对应的对象是否存在,不存在则创建代理。所以如果你知道该id在数据库中一定有对应记录存在就可以使用load方法来实现延迟加载。 对于get方法,hibernate会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在二级缓存中查找,还没有就查数据库,数据库中没有就返回null。
2.get方法首先查询session缓存,没有的话查询二级缓存,最后查询数据库;反而load方法创建时首先查询session缓存,没有就创建代理,实际使用数据时才查询二级缓存和数据库。
总之对于get和load的根本区别,一句话,hibernate对于load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,只能抛异常;而对于get方法,hibernate一定要获取到真实的数据,否则返回null。
1.如果找不到符合条件的纪录,get()方法将返回null.而load()将会报出objectnotfoundecception.
2.load()方法可以返回实体的代理类实例,而get()永远只返回实体类.
3.load()方法可以充分利用二级缓存和内部缓存的现有数据,而get()方法只在内部缓存中进行查找,如没有发现对应数据将跳过二级缓存,直接调用sql完成查找.
下一篇: php分页查询的简单实现代码
推荐阅读
-
Hibernate中load方法与get方法的区别
-
Java中char数组(字符数组)与字符串String类型的转换方法
-
ASP.NET中MD5与SHA1加密的几种方法
-
PHP中检索字符串的方法分析【strstr与substr_count方法】
-
java中Class.getMethods()和Class.getDeclaredMethods()方法的区别
-
php自定义函数br2nl实现将html中br换行符转换为文本输入中换行符的方法【与函数nl2br功能相反】
-
java模拟http的Get/Post请求,并设置ip与port代理的方法
-
java 中同步方法和同步代码块的区别详解
-
Yii框架引用插件和ckeditor中body与P标签去除的方法
-
IntelliJ IDEA中显示和关闭工具栏与目录栏的方法