浅谈Hibernate中的几个查询
一、load和get
相信大家对这两个方法已经非常熟悉了,都是根据数据索引来查找对象,这里针对其区别来从各方面比较一下:
1、load方面在查询时,先从一级缓存中寻找与数据索引对应的实体对象,然后构建并返回一个代理对象,当我们真正使用这个代理对象的时候,这时候才会进入二级缓存查找或到数据库加载数据,如果数据库中没有找到则抛出一个ObjectNotFoundException;
2、get方法在查询时,同样是先从一级缓存中寻找与数据索引对应的实体对象,如果有则直接返回该实体对象,如果没有则马上进入二级缓存查找或到数据库加载数据,查找到则直接返回查询对象,没有则返回一个null;
二、list和iterator
1 、list方法会直接避开一二级缓存直接到数据库中加载数据,然后将查询结果放入缓存中,当然如果你配置了查询缓存,他会先进入查询缓存寻找,如果没有满足条件的再进入数据库加载数据;
2、iterator方法在查询时是先从数据库中查询出所有满足条件的数据索引,然后再根据这些数据索引进入一级和二级缓存进行匹配,如果对于数据索引有实体对象则直接返回该对象,如果没有则在具体使用对象的时候才会进入数据库加载数据,并且把数据索引和对于实体对象放进缓存;
三、延迟加载
1、对于load方法,它在查询对象的时候始终返回的一个代理对象,那么为什么hibernate要引入这么一个方式呢,为什么不像get方法一样直接返回查询对象呢?出于对hibernate的性能考虑,hibernate则提出了一个解决方案,那就是延迟加载,这里load方法的使用则正是实体对象延迟加载的表现。
2、对于iterator方法,为什么它每次查询对要先将所有满足条件的数据索引查询出来,而不是像list一样直接返回满足条件的结果集?和load方法一样,这样做也是为了解决hibernate的性能问题,当只有具体使用时才会根据数据索引进入数据库加载数据。这里有个问题,当进入数据库加载数据后会将所有满足条件的数据索引和实体对象放进缓存中,但是如果数据有100W条呢?这时候会出现outOfMerroyError,一种解决方案是在一边查询数据时一边session.evict()或sessionFactory.evict();来销毁缓存中的对象。实际应用中对于这种问题还是建议大家使用JDBC来处理。
分享到:
相关推荐
本文将深入探讨Hibernate中的一些重要方法及其调用,包括get()、load()、list()、iterator()以及HQL查询的相关知识点。 1. get()与load()方法: - get()方法:当尝试获取一个对象时,get()首先会在一级缓存中查找...
3. `Session`的`load()`和`get()`方法,以及`Query`的`list()`和`iterator()`方法的不同: - `Session.load()`和`Session.get()`的区别在于是否支持延迟加载和在找不到对象时的行为。 - `Query.list()`:返回所有...
- **4.2 persistent(持久化状态)**: 表示对象已被持久化,即有一个对应的数据库记录,并且与Session建立了关联,此时Hibernate会自动同步对象的状态和数据库中的记录。 - **4.3 detached(游离状态)**: 表示对象...
本文将针对Hibernate中的几个重要概念进行详细讲解,包括主键生成策略、get()与load()的区别以及二级缓存的使用。 首先,探讨的是Hibernate中的主键生成策略。在Hibernate中,主键的生成主要有三种方式:uuid、...
Hibernate查询提供了丰富的工具和策略,不仅限于基本的get()和load(),还包括高效的list()与iterator(),以及强大的HQL语言。理解并熟练掌握这些技术,对于Java开发者优化数据访问性能、提升应用程序效率至关重要。...
本文将深入探讨Hibernate中的几种主要的数据获取方式,包括`Session.get()`与`Session.load()`、`Query.iterator()`与`Query.list()`以及使用HQL(Hibernate Query Language)进行查询。 ### 1. `Session.get()`与`...
以上介绍了Hibernate中几种常见的查询方式,包括HQL、QBC、原生SQL以及一些高级查询技巧如分组、排序等。掌握这些基本操作可以帮助开发者更高效地使用Hibernate框架进行数据访问操作。随着实践经验的积累,还可以...
本文将详细介绍Hibernate的几种主要查询方式,包括对象的状态变化、数据加载机制,以及如何通过不同方法进行条件查询。 #### 二、对象状态及其变化 在Hibernate中,一个对象可以处于三种不同的状态:自由态...
- `get()`和`load()`方法:`load()`使用二级缓存,而`get()`在一级缓存未命中时直接查询数据库。如果对象已缓存,使用`load()`更优。 - `list()`和`iterator()`方法: - `list()`一次性执行查询并返回结果,通常...
在Hibernate中,所有的数据库操作都应当在一个事务的上下文中执行。 4. **Query**: 用于执行HQL(Hibernate Query Language)或原生SQL查询。 5. **Lazy Loading**: 惰性加载机制,用于延迟加载关联对象。只有当真正...
- **list()**:将查询结果转换为 List 集合,一次性加载所有结果,适用于数据量较小的情况,因为所有结果都会加载到内存中。 - **iterator()**:返回一个迭代器,可以按需逐条加载数据,减少内存占用,适合大数据量...
2. **Session 的 load/get 方法**:load 会尝试从二级缓存中获取数据,而 get 不会。 3. **Query 和 list/iterator**:list 仅利用查询缓存,而 iterator 可以利用二级缓存。iterator 在处理大量数据时更为高效,...
Hibernate 难点解析: hibernate中uuid和native的相关总结 ...hibernate二级缓存中list和iterator的用法 Hibernate中的对象有三种状态: lock和update区别 save 和update区别 update 和saveOrUpdate区别
2. **对象的加载(Load/Get)**: 根据主键从数据库中加载对象,Load方法确保返回的是同一对象实例,而Get方法可能返回新实例。 3. **对象的更新(Update)**: 更新数据库中的对象,包括对象属性的修改。 4. **对象...
### Hibernate入门经典实例详解 #### 实验一:Hibernate开发框架搭建 **实验目的:** - 理解并掌握如何使用Hibernate进行持久层开发; - 了解三层架构的意义:业务逻辑层、数据持久层和数据库。 **技术要点:** ...
在Web项目中集成Hibernate,通常会涉及以下几个步骤: 1. **配置**:在项目中引入Hibernate的依赖库,例如通过Maven或Gradle。然后,需要配置Hibernate的主配置文件(通常是`hibernate.cfg.xml`),其中包含了...
2. **迭代器(Iterator)**:使用`iterator`方法查询时,Hibernate同样会先尝试从缓存中获取结果,如果缓存中没有,则执行SQL查询并将结果返回。 3. **负载(Load/Get)**:`load`和`get`方法用于加载实体对象,其中...
3. **Session的load/get方法选择**:load方法会检查二级缓存,而get方法则直接查询数据库。根据实际情况选择合适的方法可以提升性能。 #### 五、主配置参数优化 1. **查询缓存的合理使用**:虽然查询缓存可以加快...
2. **Session 的 load/get 方法**:load 方法会尝试从二级缓存中获取数据,而 get 方法则直接从数据库获取。根据具体情况选择合适的方法可以提高性能。 3. **Query 和 list/iterator**:list 方法仅利用查询缓存,...