Hibernate数据加载——Session.get/load
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. 返回数据对象。
分享到:
- 2008-03-16 15:15
- 浏览 1641
- 评论(1)
- 论坛回复 / 浏览 (0 / 4608)
- 查看更多
相关推荐
本文主要介绍使用注解方式配置的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(...
- **get** 方法:一旦调用`get`方法,并且指定的ID对应的实体对象不在当前Session的缓存中,Hibernate将立即执行SQL查询语句从数据库加载数据。 - **load** 方法:只有当调用了`load`返回的对象的属性或方法时,...
- **Read**:`Session.get()`或`Session.load()`用于根据主键获取对象,`Session.createQuery()`或`Session.createNativeQuery()`进行更复杂的查询。 - **Update**:更新对象状态后,调用`Session.update()`或`...
可以使用`get()`或`load()`方法获取单个对象,`query()`或`createCriteria()`方法创建查询,并通过执行查询获取结果集。例如,使用HQL(Hibernate Query Language)查询: ```java Query<MyEntity> query = session...
例如,使用`save()`或`saveOrUpdate()`方法保存对象,`delete()`删除对象,`get()`或`load()`查询对象,`Query`或`Criteria`接口进行复杂的查询。 8. **缓存机制**:Hibernate支持二级缓存,它可以提高数据读取效率...
4. 查询:使用Query或Criteria API进行复杂查询,或通过Session的get()和load()方法获取单个对象。 六、缓存机制 Hibernate支持一级缓存(Session级别的缓存)和二级缓存(SessionFactory级别的缓存)。一级缓存...
通过将Java对象与数据库表之间的映射关系进行抽象,Hibernate允许开发者用面向对象的方式处理数据,从而减少了对SQL的直接依赖。 ### Hibernate 4简介 Hibernate 4是Hibernate框架的一个重要版本,它带来了许多改进...
4. **持久化操作**:Hibernate提供了一系列API来进行CRUD(创建、读取、更新、删除)操作,如`Session`接口中的`save()`, `update()`, `delete()`, `load()`和`get()`方法。 5. **HQL(Hibernate Query Language)*...
Hibernate中Session.get()方法和load()方法是两个常用的数据访问方法,但它们之间有着本质的区别。 首先,从返回值上看,get()方法直接返回实体类,如果查不到数据则返回null。load()方法则返回一个实体代理对象,...
4. 加载(Get/Load):根据ID获取数据库中的对象。 5. 查询(Query/Criteria):使用HQL或Criteria API执行复杂的数据查询。 六、缓存机制 Hibernate提供了二级缓存机制,包括Session级别的第一级缓存和...
1. **单个对象加载(Single Entity Loading)**:通过`Session.get()`或`Session.load()`方法加载单个对象,前者会立即从数据库中取数据,后者创建代理对象,数据在第一次访问时加载。 2. **集合加载(Collection ...
1. **查询**:使用 `session.get()` 或 `session.load()` 获取单个对象,`session.createQuery()` 或 `session.createCriteria()` 用于执行 HQL(Hibernate Query Language)查询。 2. **更新**:通过 `session....
在4.3.8.Final中,Session的实现更加强大,提供了诸如save()、update()、delete()等方法进行数据的增删改,以及get()、load()等方法进行查询。同时,Criteria API和HQL(Hibernate Query Language)的使用让查询更加...
使用`Session.get()`或`Session.load()`根据主键获取对象,或者使用`Session.createQuery()`或`Session.createCriteria()`执行HQL(Hibernate查询语言)或SQL查询。 3. **更新(Update)** 修改对象的属性,然后...
- **支持懒加载**:`load`方法天然支持懒加载,而`get`方法不支持懒加载,这意味着对于那些不确定数据是否存在的场景,使用`get`方法可能更为合适。 - **性能考虑**:由于`load`方法可以通过懒加载来延迟数据的...
3. 数据库操作:通过SessionFactory获取Session,然后调用Session的save()、update()、delete()、get()、load()等方法进行CRUD操作。 4. 查询语句:利用Query或Criteria API编写HQL(Hibernate Query Language)或...
4. CRUD 操作:通过 Session 对象实现增删改查操作,如 Session.save()、Session.delete()、Session.load() 和 Session.get()。 5. 查询:利用 HQL 或 Criteria API 实现动态查询,支持分页、排序、聚合等高级功能。...
1. **加载方式**:`load()`采用延迟加载,`get()`则立即加载数据。 2. **异常处理**:`load()`假设数据一定存在,如果数据不存在,会抛出`ObjectNotFoundException`异常;`get()`则会先检查缓存,如果缓存中没有对应...