1 List和Iterator
a. list--从数据库中查询出所有的对象列表;只能利用查询缓存(但在交易系统中查询缓存作用不大),无法利用二级缓存中的单个实体,但list查出的对象会写入二级缓存,但它一般只生成较少的执行SQL语句,很多情况就是一条(无关联)。
b. iterator--只从数据库中查询出所有的对象id;可以利用二级缓存,对于一条查询语句,它会先从数据库中找出所有符合条件的记录的ID,再通过ID去缓存找,对于缓存中没有的记录,再构造语句从数据库中查出,因此很容易知道,如果缓存中没有任何符合条件的记录,使用iterator会产生N+1条SQL语句(N为符合条件的记录数)
c. 例如:
List<Student> ls = session.createQuery("from Student".list();
Iterator it = ls.iterator();
//这种用法生成的SQL:
Hibernate: select student0_.id as id0_,
student0_.name as name0_,
student0_.sex as sex0_,
student0_.age as age0_,
student0_.birthday as birthday0_ from student student0_
一次性把所有学生查出来
Iterator it = session.createQuery("from Student".iterate();
这种用法会先把所有ID查出来 SQL语句:select student0_.id from student student0_
迭代的过程中 在用每个ID 去查处ID对应的记录
SQL语句:
Hibernate: select student0_.id as id0_,
student0_.name as name0_,
student0_.sex as sex0_,
student0_.age as age0_,
student0_.birthday as birthday0_ from student student0_ where student0_.id = ?
2 load和get
Hibernate中有两个极为相似的方法get()与load(),他们都可以通过指定的实体类与ID从数据库中读取数据,并返回对应的实例,但Hibernate不会搞两个完全一样的方法的,它们间的不同在于:
1.如果找不到符合条件的纪录,get()方法将返回null.而load()将会报出ObjectNotFoundEcception.
2.load()方法可以返回实体的代理类实例,而get()永远只返回实体类.
3.load()方法可以充分利用二级缓存和内部缓存的现有数据,而get()方法只在内部缓存中进行查找,如没有发现对应数据将跳过二级缓存,直接调用SQL完成查找.
呵呵,没有说到根本点上,hibernate中get方法和load方法的根本区别在于:如果你使用load方法,hibernate认为该id对应的对象(数据库记录)在数据库中是一定存在的,所以它可以放心的使用,它可以放心的使用代理来延迟加载该对象。在用到对象中的其他属性数据时才查询数据库,但是万一数据库中不存在该记录,那没办法,只能抛异常,所说的load方法抛异常是指在使用该对象的数据时,数据库中不存在该数据时抛异常,而不是在创建这个对象时。由于session中的缓存对于hibernate来说是个相当廉价的资源,所以在load时会先查一下session缓存看看该id对应的对象是否存在,不存在则创建代理。所以如果你知道该id在数据库中一定有对应记录存在就可以使用load方法来实现延迟加载。
对于get方法,hibernate会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在二级缓存中查找,还没有就查数据库,数据库中没有就返回null。
对于第2点,虽然好多书中都这么说:“get()永远只返回实体类”,但实际上这是不正确的,get方法如果在session缓存中找到了该id对应的对象,如果刚好该对象前面是被代理过的,如被load方法使用过,或者被其他关联对象延迟加载过,那么返回的还是原先的代理对象,而不是实体类对象,如果该代理对象还没有加载实体数据(就是id以外的其他属性数据),那么它会查询二级缓存或者数据库来加载数据,但是返回的还是代理对象,只不过已经加载了实体数据。
3。胡说八道,前面已经讲了,get方法首先查询session缓存,没有的话查询二级缓存,最后查询数据库;反而load方法创建时首先查询session缓存,没有就创建代理,实际使用数据时才查询二级缓存和数据库。
总之对于get和load的根本区别,一句话,hibernate对于load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,只能抛异常;而对于get方法,hibernate一定要获取到真实的数据,否则返回null。
分享到:
相关推荐
`get` 和 `load`: 这两个方法都是用于从数据库中获取单个对象。`get`方法直接返回一个实体对象,如果数据库中没有找到对应ID的数据,则返回null。而`load`方法返回的是一个代理对象,即使数据库中没有对应的记录,...
//该方法将到classpath下解析hibernate.cfg.xml中的配置,如果不用Hibernate默认的配置文件名和路径,可在该方法中指定Hibernate配置文件的名称和路径 2.用Configuration对象获取SessionFactory和Session对象:...
- `list()`、`uniqueResult()`、`iterate()`等方法处理查询结果。 3. **更新(Update)** - 修改对象的属性,然后调用`Session`的`update()`方法将对象的状态同步到数据库。 - 或者,先`load()`或`get()`对象,...
Hibernate是一个开源的对象关系映射(ORM)框架,它能够将Java对象映射到数据库表中,并管理这些对象的生命周期。本篇文章主要介绍初学者在学习Hibernate时会遇到的基础语句,通过简单的示例帮助读者快速上手并理解...
**Hibernate4 学习笔记** Hibernate4 是一个流行的开源对象关系映射(ORM)框架,它简化了Java...在实际开发中,合理配置和使用二级缓存、选择合适的查询方法以及理解load和get的区别,都能显著提升数据库操作的效率。
8.4.2 Session的load()和get()方法 8.4.3 Session的update()方法 8.4.4 Session的saveOrUpdate()方法 8.4.5 Session的merge()方法 8.4.6 Session的delete()方法 8.4.7 Session的replicate()方法 8.5 ...
List()和iterate查询的主要区别在于,List每次都会查询SQL并放入缓存,而iterate在缓存中不存在数据时可能出现N+1问题。 `get()`和`load()`方法都会利用一级缓存,当对象被加载到Session时,数据首先会被存入缓存而...
- **操作行为**:当调用Session的`get()`、`load()`、`save()`、`update()`、`saveOrUpdate()`、`Query`或`Criteria`的`list()`、`iterate()`等方法时,Hibernate会自动处理一级缓存。 - **查询示例**:在同一个...
3. **检索**: `Session`的`get()`、`load()`方法获取单个实体,`list()`, `scroll()`, `iterate()`用于查询结果集。 4. **删除**: 使用`Session`的`delete()`方法删除实体。 5. **事务处理**: 在事务边界内执行...
- 执行`save()`、`update()`、`saveOrUpdate()`等操作时,如果使用`load()`、`get()`、`list()`、`iterate()`等方法,则可能会触发缓存的刷新。 - 在调用`flush()`方法时,会将Session内的状态同步到数据库,并且...
您可以使用Hibernate Middlegen、HIbernate Tools、Hibernate Syhchronizer等工具或手工的方式,编写Hibernate的领域对象和映射文件。其中对应T_FILE表的领域对象Tfile.java为: 代码 1 领域对象Tfile 1. ...
- **查询**:使用`get()`、`load()`或查询接口的`list()`、`iterate()`、`filter()`等方法,如果对象不在缓存中,则从数据库加载后存储于缓存。 - **清除**:可以使用`evict(Object obj)`从缓存中移除特定对象,或...
8.4.2 Session的load()和get()方法 8.4.3 Session的update()方法 8.4.4 Session的saveOrUpdate()方法 8.4.5 Session的merge()方法 8.4.6 Session的delete()方法 8.4.7 Session的replicate()方法 8.5 ...
8.4.2 Session的load()和get()方法 8.4.3 Session的update()方法 8.4.4 Session的saveOrUpdate()方法 8.4.5 Session的merge()方法 8.4.6 Session的delete()方法 8.4.7 Session的replicate()方法 8.5 ...
8.4.2 Session的load()和get()方法 8.4.3 Session的update()方法 8.4.4 Session的saveOrUpdate()方法 8.4.5 Session的merge()方法 8.4.6 Session的delete()方法 8.4.7 Session的replicate()方法 8.5 ...
在Hibernate中,一个对象可以处于三种不同的状态:自由态(Transient)、持久态(Persistent)和游离态(Detached)。 1. **自由态 (Transient)**:当一个对象与Session没有关联时,它处于自由态。例如,新创建的...
当应用程序调用Session的save()、update()、savaeOrUpdate()、get()或load(),以及调用查询接口的list()、iterate()或filter()方法时,如果在Session缓存中还不存在相应的对象,Hibernate就会把该对象加入到一级缓存...
- `find`和`iterate`的区别在于,如果查询结果较大时,`find`会一次性加载所有数据到内存中,可能导致性能问题;而`iterate`则是按需加载,更适合处理大量数据的情况。 3. **save/update/saveOrUpdate/delete**:...