Hibernate中有两个极为相似的方法get()与load(),他们都可以通过指定的实体类与ID从数据库中读取数据,并返回对应的实例,但Hibernate不会搞两个完全一样的方法的,它们间的不同在于:
1.如果找不到符合条件的纪录,get()方法将返回null.而load()将会报出ObjectNotFoundEcception.
2.
load()方法可以返回实体的代理类实例(这取决于映射文件对类检索策略的设置,如果<class >中的lazy属性设置为false,则采用立即检索策略,返回实体类,如果lazy属性设置为true,则采用延迟检索策略,返回实体的代理类示例,代理类的实例由hibernate在运行时动态生成,继承了实体类,因此继承了实体类的所有属性和方法。当Hibernate创建实体的代理类实例时,仅仅初始化了它的OID属性,其他属性都为空),而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以外的其他属性数据),那么它会查询二级缓存或者数据库来加载数据,但是返回的还是代理对象,只不过已经 加载了实体数据。
前面已经讲了,get方法首先查询session缓存,没有的话查询二级缓存,最后查询数据库;反而load方法创建时首先查询session缓存,没有就创建代理,实际使用数据时才查询二级缓存和数据库。
总之对于get和load的根本区别,一句话,hibernate对于load方法认为该数据在数据库中一定存在,可以放心的使用代理来延迟加载,如果在使用过程中发现了问题,只能抛异常;而对于get方法,hibernate一定要获取到真实的数据,否则返回null。
===================================================================
query.list()与query.iterate()区别:
Iterator iterate():
Return the query results as an Iterator. If the query contains multiple results pre row, the results are returned in an instance of Object[].
Entities returned as results are initialized on demand. The first SQL query returns identifiers only.
List list():
Return the query results as a List. If the query contains multiple results pre row, the results are returned in an instance of Object[].
list: 结果存入缓存,但不从缓存里面取;查询时属性连同id一起找出来,只有“一句”select;
iterate:结果存入缓存,并在缓存中查找结果;查询时先找出所有的 id,然后根据 id 到缓存里面查找,如果没有命中,再到数据库中查找该id对应的其他属性。可能会有多行 select。
分享到:
相关推荐
### HIBERNATE_QUERY知识点详解 #### 一、概述 Hibernate作为一款强大的对象关系映射(ORM)框架,为Java开发者提供了一套高效且简洁的方式来处理数据库操作。它支持多种查询方式,包括面向对象的查询语言(HQL)...
Order order = (Order) session.get(Order.class, orderId); ``` - 使用`load`方法: ```java Order order = (Order) session.load(Order.class, orderId); ``` - 注意:`get`方法会在找不到对象时返回`null`...
今天我们将探讨的是Hibernate的二级缓存,特别是`list`和`iterate`方法的区别,这对于优化数据库访问性能至关重要。 一级缓存是Hibernate内置的,它是Session级别的缓存,自动管理实体对象的生命周期。然而,一级...
List()和iterate查询的主要区别在于,List每次都会查询SQL并放入缓存,而iterate在缓存中不存在数据时可能出现N+1问题。 `get()`和`load()`方法都会利用一级缓存,当对象被加载到Session时,数据首先会被存入缓存而...
1. `get()`方法:当我们调用`session.get()`来获取一个对象时,Hibernate会首先检查一级缓存中是否存在该对象。如果存在,就直接从缓存中返回,而不再执行SQL查询。 2. `load()`方法:与`get()`类似,`load()`也会...
标题中的"plone.app.iterate-1.0a1.2.tar.gz"是一个Python库的压缩包文件,属于Plone生态的一部分。Plone是一个开源的内容管理系统(CMS),它基于Zope应用服务器,广泛用于构建企业级网站、内网、知识管理和协作...
在iBatis中,`<iterate>`标签是一个非常实用的功能,它允许我们处理集合数据,如数组、List或Map等,进行循环遍历并生成动态SQL语句。下面我们将详细探讨`<iterate>`标签的用法及其示例。 `<iterate>`标签的主要...
标题中的"PyPI 官网下载 | plone.app.iterate-1.0a1.2-py2.4.egg"表明这是一个从Python Package Index(PyPI)官方源下载的软件包,具体是`plone.app.iterate`的1.0a1.2版本,针对Python 2.4编译的EGG格式文件。...
【标题】"Hibernate教程24_Hibernate的补充_list与iterator" 在Java开发中,Hibernate作为一款流行的ORM(对象关系映射)框架,极大地简化了数据库操作。本教程将重点讲解在使用Hibernate时,如何处理查询结果集合...
- **Query.list()** 和 **Query.iterate()** 的主要区别在于返回类型和查询策略: - **Query.list()** 直接查询数据库,并将结果存储在内存中,适合数据量较小的情况。 - **Query.iterate()** 则会先获取ID列表,...
一.使用Hibernate的Session对象操作数据库 1.初始化Hibernate:在要使用Hibernate的类的方法中实例化... (7).createQuery(String HQL).list()/iterate()/uniqueResult(); //HQL(Hibernate Query Language)语句查询
**游离态(Managed)**:游离态是介于瞬时态和持久态之间的一种状态,通常在关闭Session后再打开新的Session,通过`load()`或`get()`方法加载的对象处于游离态,它们与数据库有ID关联,但不在当前Session的缓存中。...
不过,list操作不会使用缓存,而iterate则会先获取所有ID,然后逐个load,如果ID已在缓存中,则从缓存获取,否则从数据库加载。使用`<cache usage="read-write">`配置,表示使用读写缓存策略,当实体被修改时,...
在Java的Hibernate框架中,使用SQL语句是一个常见的需求,特别是在处理特定的数据库操作或优化查询性能时。Hibernate,作为SSH(Spring、Struts、Hibernate)三大Web开发框架之一,提供了一种优雅的方式将对象关系...
### Hibernate 批量删除知识点详解 #### 一、概述 在进行数据库操作时,经常会遇到需要批量处理数据的情况,例如批量更新或批量删除等。利用Hibernate框架可以方便地实现这些功能,提高开发效率并减少资源消耗。...
资源分类:Python库 所属语言:Python 资源全名:plone.app.iterate-1.0b1.1-py2.4.egg 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
在Java Web开发中,Struts与Hibernate是非常流行的框架组合,用于构建复杂的企业级应用。本文将详细介绍如何利用Struts和Hibernate来实现对Oracle数据库中所有记录的查询及显示功能。 #### 二、技术背景介绍 1. **...