`

hibernate 中 get、load 的 区别

阅读更多

 第一篇

这次我们来谈一下Hibernate3.2 Session加载数据时get和load方法的区别(Hibernate 3以后的版本就用get()方法取代find()这个方法了),其实这个在网上有很多的论述,可大多语焉不详或经不起实践的推敲,让很多初学者学的满腹疑 窦,现在我给大家讲解一下:

1. 对于Hibernate get方法,Hibernate会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在二级缓存中查找,还没有就查询数据库,数据 库中没有就返回null。这个相对比较简单,也没有太大的争议。主要要说明的一点就是在这个版本中get方法也会查找二级缓存!

2. Hibernate load方法加载实体对象的时候,根据映射文件上类级别的lazy属性的配置(默认为true),分情况讨论:

(1)若为true,则首先在Session缓存中查找,看看该id对应的对象是否存在,不存在则使用延迟加载,返回实体的代理类对象(该代理类为 实体类的子类,由CGLIB动态生成)。等到具体使用该对象(除获取OID以外)的时候,再查询二级缓存和数据库,若仍没发现符合条件的记录,则会抛出一 个ObjectNotFoundException。

(2)若为false,就跟Hibernate get方法查找顺序一样,只是最终若没发现符合条件的记录,则会抛出一个ObjectNotFoundException。

这里get和load有两个重要区别:

如果未能发现符合条件的记录,Hibernate get方法返回null,而load方法会抛出一个ObjectNotFoundException。 
load 方法可返回没有加载实体数据的代理类实例,而get方法永远返回有实体数据的对象。(对于load和get方法返回类型:好多书中都说:“get方法永远 只返回实体类”,实际上并不正确,get方法如果在session缓存中找到了该id对应的对象,如果刚好该对象前面是被代理过的,如被load方法使用 过,或者被其他关联对象延迟加载过,那么返回的还是原先的代理对象,而不是实体类对象,如果该代理对象还没有加载实体数据(就是id以外的其他属性数 据),那么它会查询二级缓存或者数据库来加载数据,但是返回的还是代理对象,只不过已经加载了实体数据。) 
总之对于get和load的根本区别,一句话,hibernate对于load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,只能抛异常;而对于get方法,hibernate一定要获取到真实的数据,否则返回null。

最后,我们分析下为什么网路上那么多关于二者区别的文章不太准确!首先可能是版本问题,Hibernate版本不同,运行机制不太一样;其次就是很 多朋友只是把自己经验所得与人分享,并没有经过全方位代码的检测;最后就是有些技术牛人,表达比较随意。所以我希望大家以后学习知识的时候不要盲从他人迷 信权威,一定要综合多方资料,比较和整理,再经过自己实践检验,这样得到的知识才是真实有效的。

 

第二篇

  1. Users user = (Users)session.load(Users. class , userId);    

get加载方法:

Java代码 
  1. Users user = (Users)session.get(Users. class , userId);  

 

两加载方法区别:

区别1:如果数据库中,没有userId的对象。如果通过get方法加载,则返回的是一个null;如果通过load加载,则返回一个代理对象,如果后面代码如果调用user对象的某个属性(比如user.getPassword())会抛出异常:org.hibernate .ObjectNotFoundException;

区别2:load支持延迟加载,get不支持延迟加载。

也就是说:
Java代码 
  1. Users user = (Users)session.load(Users. class , userId);  

这句代码不会去执行数据库查询,只有用到user时才会去执行数据库查询。

而:
Java代码 
  1. Users user = (Users)session.get(Users. class , userId);  

则立即去执行数据库查询。 所以Users user = (Users)session.load(Users.class, userId);不会执行任何sql。

注意:
Java代码 
  1. Users user = (Users)session.load(Users. class , userId);  
  2. System.out.println(user.getId());  

上面这2句代码,不会去执行数据库操作。因为load后会在hibernate 的一级缓存里存放一个map对象,该map的key就是userId的值,但是当你getId()时,它会去一级缓存里拿map的key值,而不去执行数据库查询。所以不会报任何错。不会执行任何数据库操作。

1
1
分享到:
评论
3 楼 wxqhbw2008 2012-05-28  
恩,不错的帖子
2 楼 wuliaolll 2011-09-09  
嗯,讲解得不错。
1 楼 kbzl251 2011-09-09  
Good Nice!

相关推荐

    hibernate get load区别

    ### Hibernate中的Get与Load方法详解 #### 概述 在Hibernate框架中,`get`与`load`方法都是用于从数据库加载实体对象的常用手段。然而,这两种方法在实现细节上有着本质的区别,这些差异主要体现在对缓存的利用、...

    hibernate中get和load方法的区别

    在Java的持久化框架Hibernate中,`get`和`load`方法都是用于从数据库中获取对象,但它们之间存在一些重要的区别。理解这些差异对于优化应用程序的性能和避免潜在问题至关重要。 首先,`get`方法是直接从数据库中...

    Hibernate的get和load方法的区别

    在Java的持久化框架Hibernate中,`get`和`load`方法都是用于从数据库中获取对象,但它们之间存在一些重要的区别。理解这些差异对于优化应用程序的性能和避免潜在问题至关重要。 首先,让我们来深入了解一下`get`...

    hibernate中get和load的区别共5页.pdf

    标签“hibernate中get和lo”暗示了标签可能被意外截断,但我们可以推断完整标签可能是“hibernate中get和load的区别”。 在实际开发中,选择使用`get`还是`load`取决于具体需求。如果需要立即从数据库中获取对象,...

    hibernate 三种 查询 方式 load与get的区别

    本篇文章将详细解析Hibernate中的三种主要查询方式——HQL(Hibernate Query Language)、Criteria API和Query API,并着重讨论`load()`与`get()`方法的区别。 一、HQL查询 Hibernate Query Language(HQL)是...

    Hibernate查询 load与get的区别及其它查询测试

    `load`和`get`方法是Hibernate中用于检索实体的两种主要方式,它们都是从Session接口中调用,但有明显的区别和各自的适用场景。 1. `load`方法: - `load`方法主要用于根据主键加载对象,它返回一个代理对象,而...

    Hibernate中get和load方法的区别以及close(),clear()、evict()等的区别

    本文主要讨论了`get`、`load`方法以及`flush`、`clear`、`evict`等方法的区别。 首先,让我们关注`get`和`load`的区别: 1. **返回结果对比**: - `load`方法如果找不到对应的记录,会抛出`org.hibernate....

    Hibernate中get()和load()的区别.docx

    在Hibernate ORM框架中,获取持久化对象的两种主要方法是`get()`和`load()`。它们都是用来根据主键ID查询数据库中的实体对象,但两者在执行机制和返回结果上有显著的区别。 1. `get()`方法 当调用`session.get()`...

    session的get与load比较

    在Hibernate中,`Session`接口提供了`get`和`load`两种方法来获取数据库中的实体对象。 1. **get** 方法:尝试从当前Session的缓存中获取指定ID对应的实体对象;如果缓存中不存在,则直接执行SQL查询语句从数据库中...

    hibernate get/load/saveOrUpdate/statistics

    博文链接:https://log-cd.iteye.com/blog/205166

    Hibernate中load方法与get方法的区别

    在Hibernate框架中,`load()`和`get()`都是用于从数据库中检索对象的方法,但它们在功能和行为上存在显著的差异。理解这些差异对于优化应用程序的性能和处理潜在异常至关重要。 首先,`load()`方法执行延迟加载策略...

    Hibernate中Session.get()方法和load()方法的详细比较

    Hibernate中Session.get()方法和load()方法是两个常用的数据访问方法,但它们之间有着本质的区别。 首先,从返回值上看,get()方法直接返回实体类,如果查不到数据则返回null。load()方法则返回一个实体代理对象,...

    Hibernate中文Api最新参考文档

    例如,使用`save()`或`saveOrUpdate()`方法保存实体,`load()`或`get()`方法获取实体,`update()`或`merge()`更新实体,以及`delete()`方法删除实体。 事务处理是数据库操作的重要部分,Hibernate通过`Transaction`...

    hibernate中文文档 HTML格式

    例如,使用`save()`或`persist()`方法创建新对象,`load()`或`get()`方法读取对象,`update()`或`merge()`方法更新对象,以及`delete()`方法删除对象。 3. 查询语言(HQL):Hibernate查询语言,类似于SQL,但面向...

    hibernate难点重点笔记

    本文将针对Hibernate中的几个重要概念进行详细讲解,包括主键生成策略、get()与load()的区别以及二级缓存的使用。 首先,探讨的是Hibernate中的主键生成策略。在Hibernate中,主键的生成主要有三种方式:uuid、...

    hibernate_reference中文版和Hibernate中文手册

    5. CRUD操作:Hibernate提供了便捷的方法来完成创建(save()、persist())、读取(get()、load()、query())、更新(update()、merge())和删除(delete())对象的操作。其中,HQL(Hibernate Query Language)和...

    hibernate 中文参考文档

    此外,还包括了持久化操作,如保存(save或persist)、更新(update)、删除(delete)以及加载(get或load)实体的方法。 关于关联映射,文档会讲解一对一、一对多、多对一、多对多等各种关联关系的建立,以及如何...

Global site tag (gtag.js) - Google Analytics