Hibernate数据加载——Session.get/load
个人觉得总结不错:http://blog.csdn.net/baobao8505/article/details/620437
Session.load/get方法均可以根据指定的实体类和id从数据库读取记录,并返回与之对应的实体对象。其区别在于:
- 如果未能发现符合条件的记录,get方法返回null,而load方法会抛出一个ObjectNotFoundException。
- Load方法可返回实体的代理类实例,而get方法永远直接返回实体类。
- load方法可以充分利用内部缓存和二级缓存中的现有数据,而get方法则仅仅在内部缓存中进行数据查找,如没有发现对应数据,将越过二级缓存,直接调用SQL完成数据读取。
Session在加载实体对象时,将经过的过程:
- 首先,Hibernate中维持了两级缓存。第一级缓存由Session实例维护,其中保持了Session当前所有关联实体的数据,也称为内部缓存。而第二级缓存则存在于SessionFactory层次,由当前所有由本SessionFactory构造的Session实例共享。出于性能考虑,避免无谓的数据库访问,Session在调用数据库查询功能之前,会先在缓存中进行查询。首先在第一级缓存中,通过实体类型和id进行查找,如果第一级缓存查找命中,且数据状态合法,则直接返回。
- 之后,Session会在当前“NonExists”记录中进行查找,如果“NonExists”记录中存在同样的查询条件,则返回null。“NonExists”记录了当前Session实例在之前所有查询操作中,未能查询到有效数据的查询条件(相当于一个查询黑名单列表)。如此一来,如果Session中一个无效的查询条件重复出现,即可迅速作出判断,从而获得最佳的性能表现。
- 对于load方法而言,如果内部缓存中未发现有效数据,则查询第二级缓存,如果第二级缓存命中,则返回。
- 如在缓存中未发现有效数据,则发起数据库查询操作(Select SQL),如经过查询未发现对应记录,则将此次查询的信息在“NonExists”中加以记录,并返回null。
- 根据映射配置和Select SQL得到的ResultSet,创建对应的数据对象。
- 将其数据对象纳入当前Session实体管理容器(一级缓存)。
- 执行Interceptor.onLoad方法(如果有对应的Interceptor)。
- 将数据对象纳入二级缓存。
- 如果数据对象实现了LifeCycle接口,则调用数据对象的onLoad方法。
- 返回数据对象。
相关推荐
本文主要介绍使用注解方式配置的spring mvc,之前写的spring3.0 mvc和rest小例子没有介绍到数据层的内容,现在这一篇补上。下面开始贴代码。 文中用的框架版本:spring 3,hibernate 3,没有的,自己上网下。 先说...
- **提前加载关联对象**:通过 Session 的 load 或 get 方法提前加载关联对象,避免懒加载时触发额外查询。 ```java User user = session.get(User.class, 1L); List<Order> orders = session.createQuery(...
- **Read**:`Session.get()`或`Session.load()`用于根据主键获取对象,`Session.createQuery()`或`Session.createNativeQuery()`进行更复杂的查询。 - **Update**:更新对象状态后,调用`Session.update()`或`...
- **get** 方法:一旦调用`get`方法,并且指定的ID对应的实体对象不在当前Session的缓存中,Hibernate将立即执行SQL查询语句从数据库加载数据。 - **load** 方法:只有当调用了`load`返回的对象的属性或方法时,...
4. **持久化操作**:Hibernate提供了一系列API来进行CRUD(创建、读取、更新、删除)操作,如`Session`接口中的`save()`, `update()`, `delete()`, `load()`和`get()`方法。 5. **HQL(Hibernate Query Language)*...
本篇文章主要关注如何通过Hibernate的Session接口来操纵对象,实现数据的持久化。 首先,我们需要理解Session在Hibernate中的角色。Session是Hibernate的核心接口之一,它负责对象的持久化操作,比如保存、更新、...
1. **查询**:使用 `session.get()` 或 `session.load()` 获取单个对象,`session.createQuery()` 或 `session.createCriteria()` 用于执行 HQL(Hibernate Query Language)查询。 2. **更新**:通过 `session....
例如,使用`save()`或`saveOrUpdate()`方法保存对象,`delete()`删除对象,`get()`或`load()`查询对象,`Query`或`Criteria`接口进行复杂的查询。 8. **缓存机制**:Hibernate支持二级缓存,它可以提高数据读取效率...
通过将Java对象与数据库表之间的映射关系进行抽象,Hibernate允许开发者用面向对象的方式处理数据,从而减少了对SQL的直接依赖。 ### Hibernate 4简介 Hibernate 4是Hibernate框架的一个重要版本,它带来了许多改进...
1. **单个对象加载(Single Entity Loading)**:通过`Session.get()`或`Session.load()`方法加载单个对象,前者会立即从数据库中取数据,后者创建代理对象,数据在第一次访问时加载。 2. **集合加载(Collection ...
- 读取(Read):使用`Session.get()`或`Session.load()`根据ID获取对象,`Query`接口则提供了更灵活的查询方式。 - 更新(Update):调用`Session.update()`或`Session.saveOrUpdate()`更新对象。 - 删除...
4. 查询:使用Query或Criteria API进行复杂查询,或通过Session的get()和load()方法获取单个对象。 六、缓存机制 Hibernate支持一级缓存(Session级别的缓存)和二级缓存(SessionFactory级别的缓存)。一级缓存...
例如,使用`session.save()`保存对象到数据库,`session.get()`或`session.load()`来获取对象,`session.update()`更新对象,`session.delete()`删除对象。 7. **HQL和Criteria查询**:Hibernate提供了HQL...
3. 数据库操作:通过SessionFactory获取Session,然后调用Session的save()、update()、delete()、get()、load()等方法进行CRUD操作。 4. 查询语句:利用Query或Criteria API编写HQL(Hibernate Query Language)或...
1. `get()`方法:当我们调用`session.get()`来获取一个对象时,Hibernate会首先检查一级缓存中是否存在该对象。如果存在,就直接从缓存中返回,而不再执行SQL查询。 2. `load()`方法:与`get()`类似,`load()`也会...
7. **查询和更新操作**:使用`Session`的`get()`、`load()`、`update()`和`delete()`方法完成查询、加载、更新和删除数据的操作。例如,查询用户: ```java User user = session.get(User.class, 1L); System.out...
### Jersey+Spring+Hibernate配置详解 #### 一、编写目的 本文档旨在详细介绍如何通过Spring、Hibernate和Jersey这三个框架来构建一个RESTful Web服务。文章不仅覆盖了基础的环境配置,还包括了如何搭建框架、配置...
- `load()`和`get()`的区别:load()支持延迟加载,若记录不存在则抛异常;get()找不到记录返回null,不支持延迟加载。 4. **Hibernate缓存**: - 第一级缓存:Session缓存,事务范围内的缓存,每个持久化对象有一...
4. 加载(Get/Load):根据ID获取数据库中的对象。 5. 查询(Query/Criteria):使用HQL或Criteria API执行复杂的数据查询。 六、缓存机制 Hibernate提供了二级缓存机制,包括Session级别的第一级缓存和...