您的位置:首页 > 其它

详解Hibernate中get和load方法的区别

2015-01-18 08:37 218 查看
hibernate中的get和load方发都是根据id取得一条记录。为了更清晰的了解其中的原理,我写了下面的伪代码供大家参考。

class Product$Proxy extends Product {
private Integer id = getProductId();
Product product = null;

//当我们用到了对象的实体数据时,例如:product.getName()
if(product == null) {
product = session.get(id);
if(product == null) {
throw new org.hibernate.ObjectNotFoundException();
}

return product.getName();
}
}


以上是load方法的原理,如果数据库中不存在该记录,那没办法,只能抛异常。而get方法在没有记录的情况下会返回null。

使用load方法时,它会先查一下session缓存看看该id对应的对象是否存在,不存在则创建代理。而对于get方法,hibernate会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在二级缓存中查找,还没有就查数据库,数据库中没有就返回null。get方法如果在 session缓存中找到了该id对应的对象,如果刚好该对象前面是被代理过的,如被load方法使用过,或者被其他关联对象延迟加载过,那么返回的还是 原先的代理对象,而不是实体类对象,如果该代理对象还没有加载实体数据(就是id以外的其他属性数据),那么它会查询二级缓存或者数据库来加载数据,但是
返回的还是代理对象,只不过已经加载了实体数据。get方法首先查询session缓存,没有的话查询二级缓存,最后查询数据库;反而load方法创建时首先查询session缓存,没有就创建代理,实际使用数据时才查询二级缓存和数据库。

总结:无论数据库中存不存在数据,load方法都会坚定不移的认为它存在这个对象,并使用代理来延迟加载,一旦使用到这个对象其它属性的时候,如果没有记录的话就会抛异常,唉,这也是没办法的事了,谁让你欺骗了一个那么信任你的姑娘呢?而对于get方法,我必须看是否有没有这条数据,没有的话返回null,唉,我付出的代价还算少,就不发那么大脾气了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hibernate get load