接触过 Hibernate 的朋友都知道 Session 中的 get 方法,而对于 load 方法,能够深入了解的人便不是很多。其实,如果能正确地是用 load 方法,可以是你的应用更加有效率;但是,load 方法的使用又会带来一些错误。实际上,只要我们能正确了解 load 方法,就避免这些错误的发生。下面,我以问答的形式简单介绍一下 load 方法。
- load 方法的返回值是什么?
这要分两种情况了。第一种情况,如果是 load 某个已在 Session 中存在的 Object,即你要 load 的 Object 已经是 Persistent 状态了。那么,load 方法返回的对象便是这个 Object 的引用。在这种情况下,load 和 get 的返回值是一样的。第二种情况,如果 Session 中没有你所要 load 的数据,那 load 方法将会返回一个 HibernateProxy。
- load 方法总是不 hit 数据库?那我怎么知道 load 的数据是否存在?
如果是 load Session 中已有的数据,自然不需要 hit 数据库。如果所 load 的对象在 Session 中不存在,load 方法将返回一个 Proxy,这时也不 hit 数据库。当你要方法 Proxy 所代表的实体中的除主键外的属性的话,如果这个时候 Session 中还是没有相应的对象的话,Hibernate 就将 hit 数据库,并进行 Proxy 的初始化。如果数据库中没有相应的数据,load 便会抛出异常。这也是 load 方法与 get 方法不同的地方,在数据不存在的情况下,get 返回 null,而 load 则抛出异常。
- load 的方法都会抛出哪些异常?
常见的由 load 引起的 Exception 有两种:ObjectNotFoundException 和 LazyInitializationException。前者是由于所 load 的数据在数据库中并不存在引起的。后者一般是由于 load 方法使用不正确造成的:得到由 load 返回的 Proxy 之后,在 Session 关闭的情况下 init Proxy 就会得到 LazyInitializationException。
另外,在使用 load 设置引用属性值的时候,还可能出现违法外键约束的异常。简言之,只要确保你 load 数据是存在的,并且在 Proxy 初始化的时候保证 Session 是打开的就能避免这些 Exception 的出现。
- 什么时候使用 load 方法?
简单说来,当你只想取得对数据库中一条记录的引用,而不是想的这条记录中的数据的时候(比如设置外键关系),就可以使用 load 而不是 get 方法。这样可以避免不必要的数据库访问。但是,使用 load 要格外小心,因为它比 get 方法更容易出问题。
分享到:
相关推荐
### Hibernate中的Get与Load方法详解 #### 概述 在Hibernate框架中,`get`与`load`方法都是用于从数据库加载实体对象的常用手段。然而,这两种方法在实现细节上有着本质的区别,这些差异主要体现在对缓存的利用、...
Gilead,全称为Hibernate for Flex,是用于Flex和Hibernate之间的数据绑定工具,它提供了一种在Flex客户端和Hibernate服务端之间通信的方法,使得Flex应用程序可以利用Hibernate的懒加载功能。然而,由于历史原因,...
在Java的持久化框架Hibernate中,`get`和`load`方法都是用于从数据库中获取对象,但它们之间存在一些重要的区别。理解这些差异对于优化应用程序的性能和避免潜在问题至关重要。 首先,`get`方法是直接从数据库中...
在Java的持久化框架Hibernate中,`get`和`load`方法都是用于从数据库中获取对象,但它们之间存在一些重要的区别。理解这些差异对于优化应用程序的性能和避免潜在问题至关重要。 首先,让我们来深入了解一下`get`...
`load`和`get`方法是Hibernate中用于检索实体的两种主要方式,它们都是从Session接口中调用,但有明显的区别和各自的适用场景。 1. `load`方法: - `load`方法主要用于根据主键加载对象,它返回一个代理对象,而...
在Hibernate框架中,Session是与数据库交互的主要接口,它提供了多种方法来操作对象的状态和数据。本文主要讨论了`get`、`load`方法以及`flush`、`clear`、`evict`等方法的区别。 首先,让我们关注`get`和`load`的...
在Hibernate框架中,`load()`和`get()`都是用于从数据库中检索对象的方法,但它们在功能和行为上存在显著的差异。理解这些差异对于优化应用程序的性能和处理潜在异常至关重要。 首先,`load()`方法执行延迟加载策略...
本文将详细介绍Hibernate持久层中的一些核心方法,包括`session.load`, `session.find`, `session.iterator`, `session.save`, `session.update`, `session.saveorupdate`。 1. `session.load()`: - `load()`方法...
本篇文章将详细解析Hibernate中的三种主要查询方式——HQL(Hibernate Query Language)、Criteria API和Query API,并着重讨论`load()`与`get()`方法的区别。 一、HQL查询 Hibernate Query Language(HQL)是...
在Java的持久化框架Hibernate中,`get`和`load`是两个常用的方法,它们都是用来从数据库中获取对象的。然而,它们在工作原理和使用场景上存在一些关键的区别,这些区别对于理解和优化Hibernate应用至关重要。 首先...
#### 一、`HibernateTemplate`的常用方法简介 `HibernateTemplate`提供了多种用于操作持久化对象的方法,这些方法可以分为几大类:数据插入、数据更新、数据删除、数据查询等。接下来将详细介绍其中的几种核心方法...
而`load`方法返回的是一个代理对象,即使数据库中没有对应的记录,它也会返回一个空的代理对象,只有当真正访问属性时才会抛出`EntityNotFoundException`异常。因此,当你确定对象一定存在时,可以使用`get`;不确定...
例如,使用`save()`或`persist()`方法创建新对象,`load()`或`get()`方法读取对象,`update()`或`merge()`方法更新对象,以及`delete()`方法删除对象。 3. 查询语言(HQL):Hibernate查询语言,类似于SQL,但面向...
例如,使用`save()`或`saveOrUpdate()`方法保存实体,`load()`或`get()`方法获取实体,`update()`或`merge()`更新实体,以及`delete()`方法删除实体。 事务处理是数据库操作的重要部分,Hibernate通过`Transaction`...
5. **CRUD操作**: Hibernate提供了便捷的方法进行创建(Create)、读取(Retrieve)、更新(Update)和删除/Delete)操作,如`save()`, `load()`, `update()`, `delete()`等。 6. **HQL与QBC**: Hibernate查询语言(HQL)...
10. **Callback事件**:Hibernate提供了一些生命周期回调方法,如preInsert、postLoad等,可以在对象的生命周期中插入自定义代码。 11. ** Criteria API**:这是一种更面向对象的查询方式,相比HQL,它更具有灵活性...
5. CRUD操作:Hibernate提供了便捷的方法来完成创建(save()、persist())、读取(get()、load()、query())、更新(update()、merge())和删除(delete())对象的操作。其中,HQL(Hibernate Query Language)和...
- **加载(Load)**:通过Session的load()方法,根据ID加载对象。如果对象不存在,会抛出异常。 - **查询(Query)**:使用Criteria API或HQL(Hibernate Query Language)进行查询。例如,使用Session的...
Hibernate提供了持久化操作,如保存(`save()`)、更新(`update()`)、删除(`delete()`)和加载(`get()`、`load()`)等方法。 查询语言方面,Hibernate支持HQL(Hibernate Query Language)和 Criteria 查询。...