这次我们来谈一下Hibernate3.2 Session加载数据时get和load方法的区别,其实这个在网上有很多的论述,可大多语焉不详或经不起实践的推敲,让很多初学者学的满腹疑窦,现在我给大家讲解一下:
1. 对于get方法,hibernate会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在二级缓存中查找,还没有就查询数据库,数据库中没有就返回null。这个相对比较简单,也没有太大的争议。主要要说明的一点就是在这个版本中get方法也会查找二级缓存!
2. load方法加载实体对象的时候,根据映射文件上类级别的lazy属性的配置(默认为true),分情况讨论:
(1)若为true,则首先在Session缓存中查找,看看该id对应的对象是否存在,不存在则使用延迟加载,返回实体的代理类对象(该代理类为实体类的子类,由CGLIB动态生成)。等到具体使用该对象(除获取OID以外)的时候,再查询二级缓存和数据库,若仍没发现符合条件的记录,则会抛出一个ObjectNotFoundException。
(2)若为false,就跟get方法查找顺序一样,只是最终若没发现符合条件的记录,则会抛出一个ObjectNotFoundException。
这里get和load有两个重要区别:
如果未能发现符合条件的记录,get方法返回null,而load方法会抛出一个ObjectNotFoundException。
load方法可返回没有加载实体数据的代理类实例,而get方法永远返回有实体数据的对象。(对于load和get方法返回类型:好多书中都说:“get方法永远只返回实体类”,实际上并不正确,get方法如果在session缓存中找到了该id对应的对象,如果刚好该对象前面是被代理过的,如被load方法使用过,或者被其他关联对象延迟加载过,那么返回的还是原先的代理对象,而不是实体类对象,如果该代理对象还没有加载实体数据(就是id以外的其他属性数据),那么它会查询二级缓存或者数据库来加载数据,但是返回的还是代理对象,只不过已经加载了实体数据。)
总之对于get和load的根本区别,一句话,hibernate对于load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,只能抛异常;而对于get方法,hibernate一定要获取到真实的数据,否则返回null。
最后,我们分析下为什么网路上那么多关于二者区别的文章不太准确!首先可能是版本问题,Hibernate版本不同,运行机制不太一样;其次就是很多朋友只是把自己经验所得与人分享,并没有经过全方位代码的检测;最后就是有些技术牛人,表达比较随意。所以我希望大家以后学习知识的时候不要盲从他人迷信权威,一定要综合多方资料,比较和整理,再经过自己实践检验,这样得到的知识才是真实有效的。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lenotang/archive/2008/06/29/2595349.aspx
分享到:
相关推荐
在Java的持久化框架Hibernate中,`get`和`load`方法都是用于从数据库中获取对象,但它们之间存在一些重要的区别。理解这些差异对于优化应用程序的性能和避免潜在问题至关重要。 首先,`get`方法是直接从数据库中...
### Hibernate中的Get与Load方法详解 #### 概述 在Hibernate框架中,`get`与`load`方法都是用于从数据库加载实体对象的常用手段。然而,这两种方法在实现细节上有着本质的区别,这些差异主要体现在对缓存的利用、...
在Java的持久化框架Hibernate中,`get`和`load`方法都是用于从数据库中获取对象,但它们之间存在一些重要的区别。理解这些差异对于优化应用程序的性能和避免潜在问题至关重要。 首先,让我们来深入了解一下`get`...
本篇文章将详细解析Hibernate中的三种主要查询方式——HQL(Hibernate Query Language)、Criteria API和Query API,并着重讨论`load()`与`get()`方法的区别。 一、HQL查询 Hibernate Query Language(HQL)是...
`load`和`get`方法是Hibernate中用于检索实体的两种主要方式,它们都是从Session接口中调用,但有明显的区别和各自的适用场景。 1. `load`方法: - `load`方法主要用于根据主键加载对象,它返回一个代理对象,而...
在Hibernate框架中,`load()`和`get()`都是用于从数据库中检索对象的方法,但它们在功能和行为上存在显著的差异。理解这些差异对于优化应用程序的性能和处理潜在异常至关重要。 首先,`load()`方法执行延迟加载策略...
在Hibernate框架中,Session是与数据库交互的主要接口,它提供了多种方法来操作对象的状态和数据。本文主要讨论了`get`、`load`方法以及`flush`、`clear`、`evict`等方法的区别。 首先,让我们关注`get`和`load`的...
在Java的持久化框架Hibernate中,`get`和`load`是两个常用的方法,它们都是用来从数据库中获取对象的。然而,它们在工作原理和使用场景上存在一些关键的区别,这些区别对于理解和优化Hibernate应用至关重要。 首先...
本文将深入探讨`get`与`load`两种方法的区别及其应用场景。 #### 一、基本概念 在Hibernate中,`Session`接口提供了`get`和`load`两种方法来获取数据库中的实体对象。 1. **get** 方法:尝试从当前Session的缓存...
Hibernate3 是一个强大的Java持久化框架,用于简化数据库与对象之间的交互。它是对象关系映射(ORM)工具的典范,允许开发人员使用面向对象的编程模型来操作数据库,而无需直接编写SQL语句。在本篇文章中,我们将...
在Hibernate ORM框架中,获取持久化对象的两种主要方法是`get()`和`load()`。它们都是用来根据主键ID查询数据库中的实体对象,但两者在执行机制和返回结果上有显著的区别。 1. `get()`方法 当调用`session.get()`...
Hibernate中Session.get()方法和load()方法是两个常用的数据访问方法,但它们之间有着本质的区别。 首先,从返回值上看,get()方法直接返回实体类,如果查不到数据则返回null。load()方法则返回一个实体代理对象,...
在Java持久化框架Hibernate中,HibernateTemplate是一个便捷的工具类,它封装了常见的数据库操作,使得开发者能够更方便地与数据库交互。以下是对标题和描述中提到的HibernateTemplate方法的详细总结: A. `get` 和...
这可以通过Session的get()或load()方法实现,它们根据主键值从数据库中检索对象。 2. **删除对象**:调用Session的delete()方法,传入要删除的对象。Hibernate会生成对应的DELETE SQL并执行。 3. **提交事务**:和...
- **读取(Read)**:通过Session的get()或load()方法获取对象,或者使用Query或Criteria API来执行查询操作。 - **更新(Update)**:调用Session的update()方法更新已存在的对象。 - **删除(Delete)**:使用...
Hibernate提供了持久化操作,如保存(`save()`)、更新(`update()`)、删除(`delete()`)和加载(`get()`、`load()`)等方法。 查询语言方面,Hibernate支持HQL(Hibernate Query Language)和 Criteria 查询。...
`Session`接口是Hibernate的主要工作接口,通过`save()`、`update()`、`delete()`和`get()`、`load()`等方法进行数据的持久化操作。 6. **HQL(Hibernate Query Language)**: HQL是Hibernate的查询语言,类似于SQL...