hibernate get 和load的区别[转]

el/2024/7/24 1:01:44
get和load方式是根据id取得一个记录
下边详细说一下get和load的不同,因为有些时候为了对比也会把find加进来。



1.从返回结果上对比:
load方式检索不到的话会抛出org.hibernate.ObjectNotFoundException异常
get方法检索不到的话会返回null



2.从检索执行机制上对比: get方法和find方法都是直接从数据库中检索 而load方法的执行则比较复杂首先查找session的persistent Context中是否有缓存,如果有则直接返回 如果没有则判断是否是lazy,如果不是直接访问数据库检索,查到记录返回,查不到抛出异常 如果是lazy则需要建立代理对象,对象的initialized属性为false,target属性为null 在访问获得的代理对象的属性时,检索数据库,如果找到记录则把该记录的对象复制到代理对象的target上,并将initialized=true,如果找不到就抛出异常。



3.根本区别说明
如果你使用load方法,hibernate认为该id对应的对象(数据库记录)在数据库中是一定存在的,所以它可以放心的使用,它可以放心的使用代理来 延迟加载该对象。在用到对象中的其他属性数据时才查询数据库,但是万一数据库中不存在该记录,那没办法,只能抛异常。所说的load方法抛异常是指在使用 该对象的数据时,数据库中不存在该数据时抛异常,而不是在创建这个对象时(注意:这就是由于“延迟加载”在作怪)。

由于session中的缓存对于hibernate来说是个相当廉价的资源,所以在load时会先查一下session缓存看看该id对应的对象是否存在,不存在则创建代理。所以如果你知道该id在数据库中一定有对应记录存在就可以使用load方法来实现延迟加载。

对于get方法,hibernate会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在二级缓存中查找,还没有就查数据库,数据库中没有就返回null。

对于load和get方法返回类型:虽然好多书中都这么说:“get()永远只返回实体类”,但实际上这是不正确的,get方法如果在 session缓存中找到了该id对应的对象,如果刚好该对象前面是被代理过的,如被load方法使用过,或者被其他关联对象延迟加载过,那么返回的还是 原先的代理对象,而不是实体类对象,如果该代理对象还没有加载实体数据(就是id以外的其他属性数据),那么它会查询二级缓存或者数据库来加载数据,但是 返回的还是代理对象,只不过已经加载了实体数据。

get方法首先查询session缓存,没有的话查询二级缓存,最后查询数据库;反而load方法创建时首先查询session缓存,没有就创建代理,实际使用数据时才查询二级缓存和数据库。



[b]4.简单总结

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

http://www.ngui.cc/el/5557535.html

相关文章

spring 注解事务【转】

1 Transactional 只能被应用到public方法上, 对于其它非public的方法,如果标记了Transactional也不会报错,但方法没有事务功能. 2 默认情况下,一个有事务方法, 遇到RuntiomeException 时会回滚 . 遇到 受检查的异常 是不会回滚 的. 要想所有异常都回滚,要加上 Transactional( …

Spring实现AOP的四种方式 [转]

[b]AOP的相关术语: [/b] 1.通知(Advice): 通知定义了切面是什么以及何时使用。描述了切面要完成的工作和何时需要执行这个工作。 2.连接点(Joinpoint): 程序能够应用通知的一个“时机”,这些“时机”就是连接点,例如方法被调用时、异常被抛出时等等。…

在servlet 中得到pagecontent对象

PageContext context JspFactory.getDefaultFactory().getPageContext(this, request, response, null, true, 8*1024, true);一共七个参数:第一个参数是传递一个Servlet,在servlet中传递this就可以了;第二个和第三个参数是request与respons…

js 得到当前系统时间

<script > var myDate new Date(); myDate.getYear(); //获取当前年份(2位) myDate.getFullYear(); //获取完整的年份(4位,1970-????) myDate.getMonth(); //获取当前月份(0-11,0代表1月) myDate.getDate(); //获取当前…

get row object by rowindex

var rows $(#tt).datagrid(getRows); // get current page rowsvar row rows[rowIndex]; // your row data

java 正则表达处理中文【转】

Java的正则表达式如何匹配中文字符呢? 下面给出例子让我们匹配所有的中文字符: Java代码 public static void regxChinese(){ // 要匹配的字符串 String source "<span title5 星级酒店 classdx dx5>"; // 将上面要匹配的字符串转换成小写 // source sourc…

Jquery控制滚动条滚动

$("html,body").animate({scrollTop: $("#"元素ID).offset().top}, 1000);

js调用outlook

window.open("mailto:sundyseahotmail.com?subject" value1 "&body" value2); value1为主题&#xff0c;value2为内容 以下代码&#xff1a;&#xff08;转&#xff09;<html> <head> <meta http-equiv"Content-Type" con…

fedora 安装后优化

[url]http://www.hqqblog.com/fedora-installed-donthing/[/url]