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完成查找.

(0)

相关推荐

  • Hibernate框架数据分页技术实例分析

    本文实例讲述了Hibernate框架数据分页技术.分享给大家供大家参考,具体如下: 1.数据分页机制基本思想: (1)确定记录跨度,即确定每页显示的记录条数,可根据实际情况而定. (2)获取记录总数,即获取要显示在页面中的总记录数,其目的是根据该数来确定总的分布数. (3)确定分页后的总页数.可根据公式:"总页数=(总记录数 - 1) / 每页显示的记录数 + 1". (4)根据当前页数显示数据.如果该页数小于1,则使其等于1;如果大于最大页数,则使其等于最大页数. (5)通过For.

  • 在Java的Hibernate框架中使用SQL语句的简单介绍

    Hibernate中有HQL查询语法.但我们用得比较熟的还是数SQL语句,那么应该怎么来让Hibernate支持SQL呢?这个不用我们去考虑了,Hibernate团队已经早就做好了.        废话不说,直接来例子啦. select * from t_user usr 上面是一条SQL语句,又是废话,是个人都知道.我们想让Hibernate执行这条语句,怎么办呢?看代码: Query query = session.createSQLQuery("select * from t_user u

  • java Hibernate save()与persist()区别

    Hibernate 之所以提供与save()功能几乎完全类似的persist()方法,一方面是为了照顾JPA的用法习惯.另一方面,save()和 persist()方法还有一个区别:使用 save() 方法保存持久化对象时,该方法返回该持久化对象的标识属性值(即对应记录的主键值):但使用 persist() 方法来保存持久化对象时,该方法没有任何返回值.因为 save() 方法需要立即返回持久化对象的标识属性,所以程序执行 save() 会立即将持久化对象对应的数据插入数据库:而 persist

  • MyBatis与Hibernate的比较

    第一章 Hibernate与MyBatis Hibernate 是当前最流行的O/R mapping框架,它出身于sf.net,现在已经成为Jboss的一部分. Mybatis 是另外一种优秀的O/R mapping框架.目前属于apache的一个子项目. MyBatis 参考资料官网:http://www.mybatis.org/core/zh/index.html Hibernate参考资料:http://docs.jboss.org/hibernate/core/3.6/reference

  • Hibernate管理Session和批量操作分析

    本文详细分析了Hibernate管理Session和批量操作的用法.分享给大家供大家参考.具体分析如下: Hibernate管理Session Hibernate自身提供了三种管理Session对象的方法 ① Session对象的生命周期与本地线程绑定 ② Session对象的生命周期与JTA事务绑定 ③ Hibernate委托程序管理Session对象的生命周期 在Hibernate的配置文件中,hibernate.current_session_context_class属性用于指定Sess

  • Hibernate实现批量添加数据的方法

    本文实例讲述了Hibernate实现批量添加数据的方法.分享给大家供大家参考,具体如下: 1.Hibernate_016_BatchAddData程序目录结构: 2.lib目录下所引入的jar包: 3.MedicineDao.java源代码: package com.xqh.dao; import java.util.List; import org.hibernate.Session; import com.xqh.model.Medicine; import com.xqh.

  • Struts2+Hibernate实现数据分页的方法

    本文实例讲述了Struts2+Hibernate实现数据分页的方法.分享给大家供大家参考,具体如下: 1.用Hibernate实现分页技术: /** * 使用hql语句进行分页查询 * @param hql 需要查询的hql语句 * @param offset 第一条记录索引 * @param pageSize 每页需要显示的记录数 * @return 当前页的所有记录 */ @SuppressWarnings("unchecked") public List findByPage(f

  • 浅析Java的Hibernate框架中的继承关系设计

    这次我们来说一下hibernate的层次设计,层次设计也就是实体之间的继承关系的设计.  也许这样比较抽象,我们直接看例子.  1)我们先看一下普通的做法  直接上代码:三个实类如下: public class TItem implements Serializable{ //省略Get/Set方法 private int id; private String manufacture; private String name; } public class TBook extends TItem

  • jsp Hibernate批量更新和批量删除处理代码

    以下程序直接通过Hibernate API批量更新CUSTOMERS表中年龄大于零的所有记录的AGE字段: tx = session.beginTransaction();Iterator customers=session.find("from Customer c where c.age>0").iterator();while(customers.hasNext()){Customer customer=(Customer)customers.next();customer

  • Hibernate框架中的缓存技术详解

    本文实例讲述了Hibernate框架中的缓存技术.分享给大家供大家参考,具体如下: Hibernate框架的缓存分为Session的缓存.SessionFactory的缓存,也称为一级缓存和二级缓存. 一级缓存: 一级缓存是Session级的缓存,其生命周期很短,与Session相互对应,由Hibernate进行管理,属于事务范围的缓存.当程序调用 Session的load()方法.get()方法.save()方法.saveOrUpdate()方法.update()方法或查询接口方法时,Hibe

  • hibernate批量操作实例详解

    本文实例讲述了hibernate批量操作的方法.分享给大家供大家参考,具体如下: Hibernate的批量处理 Hibernate完全以面向对象的方式来操作数据库,当程序里以面向对象的方式操作持久化对象时,将被自动转换为对数据库的操作.例如调用Session的delete()方法来删除持久化对象,Hibernate将负责删除对应的数据记录:当执行持久化对象的set方法时,Hibernate将自动转换为对应的update方法,修改数据库的对应记录. 问题是如果需要同时更新100 000条记录,是不

  • Mybatis与Hibernate的区别

    以前没怎么用过mybatis,只知道与hibernate一样是个orm数据库框架.随着使用熟练度的增加,发现它与hibernate区别是非常大的感兴趣的朋友通过本文一起学习吧 趁着这个周末,抽空把一些常用的技术整理出来,小编还会不定期的更新内容. 首先简单介绍下两者的概念: Hibernate :Hibernate 是当前最流行的ORM框架,对数据库结构提供了较为完整的封装. Mybatis:Mybatis同样也是非常流行的ORM框架,主要着力点在于POJO 与SQL之间的映射关系. 其次具体从

随机推荐