`

转:Hibernate数据加载——Session.get/load

阅读更多

Hibernate数据加载——Session.get/load

个人觉得总结不错:http://blog.csdn.net/baobao8505/article/details/620437

 

Session.load/get方法均可以根据指定的实体类和id从数据库读取记录,并返回与之对应的实体对象。其区别在于:

 

  1. 如果未能发现符合条件的记录,get方法返回null,而load方法会抛出一个ObjectNotFoundException。
  2. Load方法可返回实体的代理类实例,而get方法永远直接返回实体类。
  3. load方法可以充分利用内部缓存和二级缓存中的现有数据,而get方法则仅仅在内部缓存中进行数据查找,如没有发现对应数据,将越过二级缓存,直接调用SQL完成数据读取。

Session在加载实体对象时,将经过的过程:

  1. 首先,Hibernate中维持了两级缓存。第一级缓存由Session实例维护,其中保持了Session当前所有关联实体的数据,也称为内部缓存。而第二级缓存则存在于SessionFactory层次,由当前所有由本SessionFactory构造的Session实例共享。出于性能考虑,避免无谓的数据库访问,Session在调用数据库查询功能之前,会先在缓存中进行查询。首先在第一级缓存中,通过实体类型和id进行查找,如果第一级缓存查找命中,且数据状态合法,则直接返回。
  2. 之后,Session会在当前“NonExists”记录中进行查找,如果“NonExists”记录中存在同样的查询条件,则返回null。“NonExists”记录了当前Session实例在之前所有查询操作中,未能查询到有效数据的查询条件(相当于一个查询黑名单列表)。如此一来,如果Session中一个无效的查询条件重复出现,即可迅速作出判断,从而获得最佳的性能表现。
  3. 对于load方法而言,如果内部缓存中未发现有效数据,则查询第二级缓存,如果第二级缓存命中,则返回。
  4. 如在缓存中未发现有效数据,则发起数据库查询操作(Select SQL),如经过查询未发现对应记录,则将此次查询的信息在“NonExists”中加以记录,并返回null。
  5. 根据映射配置和Select SQL得到的ResultSet,创建对应的数据对象。
  6. 将其数据对象纳入当前Session实体管理容器(一级缓存)。
  7. 执行Interceptor.onLoad方法(如果有对应的Interceptor)。
  8. 将数据对象纳入二级缓存。
  9. 如果数据对象实现了LifeCycle接口,则调用数据对象的onLoad方法。
  10. 返回数据对象。
分享到:
评论

相关推荐

    spring_MVC源码

    本文主要介绍使用注解方式配置的spring mvc,之前写的spring3.0 mvc和rest小例子没有介绍到数据层的内容,现在这一篇补上。下面开始贴代码。 文中用的框架版本:spring 3,hibernate 3,没有的,自己上网下。 先说...

    hibernate-release-5.0.7.Final.zip官方

    - **提前加载关联对象**:通过 Session 的 load 或 get 方法提前加载关联对象,避免懒加载时触发额外查询。 ```java User user = session.get(User.class, 1L); List<Order> orders = session.createQuery(...

    Hibernate使用——入门

    - **Read**:`Session.get()`或`Session.load()`用于根据主键获取对象,`Session.createQuery()`或`Session.createNativeQuery()`进行更复杂的查询。 - **Update**:更新对象状态后,调用`Session.update()`或`...

    session的get与load比较

    - **get** 方法:一旦调用`get`方法,并且指定的ID对应的实体对象不在当前Session的缓存中,Hibernate将立即执行SQL查询语句从数据库加载数据。 - **load** 方法:只有当调用了`load`返回的对象的属性或方法时,...

    hibernate-release-5.2.11.Final.zip

    4. **持久化操作**:Hibernate提供了一系列API来进行CRUD(创建、读取、更新、删除)操作,如`Session`接口中的`save()`, `update()`, `delete()`, `load()`和`get()`方法。 5. **HQL(Hibernate Query Language)*...

    hibernate--3.Hibernate数据持久化(通过 Session 操纵对象)

    本篇文章主要关注如何通过Hibernate的Session接口来操纵对象,实现数据的持久化。 首先,我们需要理解Session在Hibernate中的角色。Session是Hibernate的核心接口之一,它负责对象的持久化操作,比如保存、更新、...

    Hibernate框架搭建及数据库相关操作

    1. **查询**:使用 `session.get()` 或 `session.load()` 获取单个对象,`session.createQuery()` 或 `session.createCriteria()` 用于执行 HQL(Hibernate Query Language)查询。 2. **更新**:通过 `session....

    hibernate-release-5.0.6.Final.zip(最新Hibernate架包)

    例如,使用`save()`或`saveOrUpdate()`方法保存对象,`delete()`删除对象,`get()`或`load()`查询对象,`Query`或`Criteria`接口进行复杂的查询。 8. **缓存机制**:Hibernate支持二级缓存,它可以提高数据读取效率...

    Hibernate 4——Hello World

    通过将Java对象与数据库表之间的映射关系进行抽象,Hibernate允许开发者用面向对象的方式处理数据,从而减少了对SQL的直接依赖。 ### Hibernate 4简介 Hibernate 4是Hibernate框架的一个重要版本,它带来了许多改进...

    Hibernate之数据加载方式

    1. **单个对象加载(Single Entity Loading)**:通过`Session.get()`或`Session.load()`方法加载单个对象,前者会立即从数据库中取数据,后者创建代理对象,数据在第一次访问时加载。 2. **集合加载(Collection ...

    Hibernate4总结文档

    - 读取(Read):使用`Session.get()`或`Session.load()`根据ID获取对象,`Query`接口则提供了更灵活的查询方式。 - 更新(Update):调用`Session.update()`或`Session.saveOrUpdate()`更新对象。 - 删除...

    hibernate-release-5.0.6.Final

    4. 查询:使用Query或Criteria API进行复杂查询,或通过Session的get()和load()方法获取单个对象。 六、缓存机制 Hibernate支持一级缓存(Session级别的缓存)和二级缓存(SessionFactory级别的缓存)。一级缓存...

    初学hibernate,hibernate入门

    例如,使用`session.save()`保存对象到数据库,`session.get()`或`session.load()`来获取对象,`session.update()`更新对象,`session.delete()`删除对象。 7. **HQL和Criteria查询**:Hibernate提供了HQL...

    hibernate-release-5.4.18.Final.zip

    3. 数据库操作:通过SessionFactory获取Session,然后调用Session的save()、update()、delete()、get()、load()等方法进行CRUD操作。 4. 查询语句:利用Query或Criteria API编写HQL(Hibernate Query Language)或...

    Hibernatehibernate一级缓存.pdf

    1. `get()`方法:当我们调用`session.get()`来获取一个对象时,Hibernate会首先检查一级缓存中是否存在该对象。如果存在,就直接从缓存中返回,而不再执行SQL查询。 2. `load()`方法:与`get()`类似,`load()`也会...

    Hibernate实例

    7. **查询和更新操作**:使用`Session`的`get()`、`load()`、`update()`和`delete()`方法完成查询、加载、更新和删除数据的操作。例如,查询用户: ```java User user = session.get(User.class, 1L); System.out...

    jersey+spring+hibernate配置

    ### Jersey+Spring+Hibernate配置详解 #### 一、编写目的 本文档旨在详细介绍如何通过Spring、Hibernate和Jersey这三个框架来构建一个RESTful Web服务。文章不仅覆盖了基础的环境配置,还包括了如何搭建框架、配置...

    2022年Hibernate常见面试题汇总.doc

    - `load()`和`get()`的区别:load()支持延迟加载,若记录不存在则抛异常;get()找不到记录返回null,不支持延迟加载。 4. **Hibernate缓存**: - 第一级缓存:Session缓存,事务范围内的缓存,每个持久化对象有一...

    hibernate-min-lib.rar

    4. 加载(Get/Load):根据ID获取数据库中的对象。 5. 查询(Query/Criteria):使用HQL或Criteria API执行复杂的数据查询。 六、缓存机制 Hibernate提供了二级缓存机制,包括Session级别的第一级缓存和...

Global site tag (gtag.js) - Google Analytics