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

来源:互联网 发布:淘宝的热线电话 编辑:程序博客网 时间:2024/04/28 23:00

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,唉,我付出的代价还算少,就不发那么大脾气了。

0 0