`
chaisencs
  • 浏览: 8359 次
  • 性别: Icon_minigender_1
  • 来自: 长春
社区版块
存档分类
最新评论

Hibernate Get和Load的区别(参见3.3.2源码)

 
阅读更多
网上关于get和load的讨论很多,下面是我的一些浅显认识。

从源码角度来讲:很简单,LoadType不同。

LoadType是LoadEventListener的内部类,源码中一共定义了7种,GET和LOAD最常用。

还有一个IMMEDIATE_LOAD(nakedEntityReturned为true)在加载代理实际数据的过程中使用。
这个类的对象在创建的时候采用了builder模式。



而GET和LOAD两种LoadType主要的区别是:

GET:allowNulls为true;allowProxyCreation为false

LOAD:allowNulls为false;allowProxyCreation为true


正因为这两个属性的不同,所以决定了get和load两个加载方法的差别:
1.如果在数据库中没有找到请求的数据,get选择返回null,而load选择抛出异常。
2.如果在缓存中没有找到代理,get直接去加载真实数据,load则返回代理,并把代理填入缓存。这也是为什么有时候get会返回代理对象的原因。

主要的区别就这些,其他博主说的是否使用二级缓存的区别都是没有根据的。
因为进入实际加载过程中,get和load调用的实际加载方法是一样的:
loadFromSessionCache
loadFromSecondLevelCache
Load From DataSource

至于为什么代理对象实际加载的过程中抛出异常,解释如下:
真正加载代理(3.3.2版本使用是的javassist代理)数据的时候,类AbstractLazyInitializer的initialize方法先执行session.immediateLoad方法,然后由checkTargetState()方法检查返回的实体是否为空,此方法调用handleEntityNotFound方法,如果实体返回的是null,那么抛出异常ObjectNotFoundException。源码大家可以自己看
分享到:
评论

相关推荐

    Hibernate3.3.2_项目源码

    Hibernate3.3.2_项目源码Hibernate3.3.2_项目源码Hibernate3.3.2_项目源码Hibernate3.3.2_项目源码Hibernate3.3.2_项目源码Hibernate3.3.2_项目源码

    hibernate-core-3.3.2.GA

    hibernate core 3.3.2.GA 源代码 源码hibernate core 3.3.2.GA 源代码 源码hibernate core 3.3.2.GA 源代码 源码hibernate core 3.3.2.GA 源代码 源码hibernate core 3.3.2.GA 源代码 源码hibernate core 3.3.2.GA ...

    hibernate-c3p0-3.3.2.GA.jar

    hibernate-c3p0-3.3.2.GA.jar

    hibernate3.3.2 包

    hibernate3.3.2hibernate3.3.2hibernate3.3.2hibernate3.3.2hibernate3.3.2hibernate3.3.2hibernate3.3.2hibernate3.3.2hibernate3.3.2hibernate3.3.2hibernate3.3.2hibernate3.3.2hibernate3.3.2hibernate3.3.2...

    hibernate-3.2源代码

    本篇文章将详细解析Hibernate 3.2的核心功能和源代码结构。 一、Hibernate概览 Hibernate是Java社区中的明星项目,它通过提供对象-关系映射服务,实现了Java对象和数据库表之间的无缝转换。在Hibernate 3.2中,优化...

    Hibernate源代码3.3.2

    最新的hibernate源代码,网上最新版本,有兴趣的朋友可以研究下。如果哪位朋友对OSGi的企业分布式应用和负载均衡有研究也希望分享下,大家一起研究,谢谢!

    hadoop 3.3.2源码包

    Hadoop 3.3.2源码包是Apache Hadoop项目的一个重要版本,它是一个开源框架,主要用于存储和处理大规模数据。Hadoop的核心组件包括HDFS(Hadoop Distributed File System)和MapReduce,这两个组件构成了大数据处理的...

    Hibernate 3.3.2.GA 核心源码

    对应hibernate3.jar,是从Hibernate官方发布版本(hibernate-distribution-3.3.2.GA-dist.zip)的\project\core\src\main\java\目录下获取。

    尚学堂_Hibernate3.3.2_项目源码

    尚学堂的Hibernate3.3.2项目源码提供了深入学习和实践Hibernate的机会,让我们一起深入探讨这个项目中的关键知识点。 首先,我们来看看Hibernate的核心概念。在Hibernate中,实体类代表数据库中的表,实体类的每个...

    hibernate-distribution-3.3.2.GA-dist

    总的来说,Hibernate 3.3.2.GA版本为Java开发者提供了强大的ORM工具,通过其丰富的特性和良好的社区支持,使得数据库操作变得更加简单和高效。无论是新手还是经验丰富的开发者,都能从中受益匪浅。

    Hibernate3.3.2

    综上所述,Hibernate 3.3.2 作为一个强大的ORM框架,其在对象关系映射、查询语言、事务管理、缓存策略、持久化模型和生命周期管理等方面都展现出了优秀的功能和性能。对于开发者来说,熟练掌握Hibernate不仅能提高...

    hibernate3.3.2官方完整版-含教程

    hibernate3.3.2官方完整版,内含java调用完整教程

    hibernate3.3.2

    1. CRUD操作:Hibernate提供了save()、update()、delete()和get()等方法进行增删改查操作。 2. Criteria API:更面向对象的查询方式,支持条件、排序、分组等操作。 3. HQL:类似SQL的查询语言,可以操作对象而非表...

    hibernate 3.3.2.jar

    Hibernate 3.3.2.jar 是一款非常重要的Java持久化框架的老版本库,适用于基于SSH(Spring、Struts、Hibernate)开发的企业级Web应用程序。这个版本的Hibernate在2009年发布,提供了对JPA(Java Persistence API)的...

    hibernate开发框架集(核心3.3.2GA+an3.4+slf4j1.5.8+api文档)

    在这个集合中,我们包含了Hibernate的核心3.3.2 GA版本,以及其相关的扩展和API文档,为开发者提供了完整的开发环境。 首先,让我们来了解Hibernate 3.3.2 GA的核心组件。这一版本的Hibernate在前一版的基础上进行...

    java视频教程_hibernate3.3.2_项目源码

    【标题】"java视频教程_hibernate3.3.2_项目源码" 是一个关于Java编程语言和Hibernate框架的教育性资源,旨在帮助学习者掌握如何在实际项目中运用Hibernate 3.3.2版本。Hibernate是Java领域的一个非常重要的对象关系...

    Hibernate 3.3.2

    在这个话题中,我们将深入探讨Hibernate 3.3.2、3.5.5以及4.3.6.Final这三个版本中的关键特性、改进和变化。 首先,让我们从Hibernate 3.3.2开始。这个版本发布于2009年,它是Hibernate 3.x系列的一个稳定版。主要...

    hibernate3.3.2api

    hibernate3.3.2api 此文档根据hibernate3.3.2源码生成为英文文档

    hibernate-distribution-3.3.2.GA-dist.zip

    《Hibernate 3.3.2 GA ...总结,Hibernate 3.3.2 GA 是一个成熟的 ORM 解决方案,其丰富的功能和优化的性能为 Java 开发者提供了便利。通过学习和掌握 Hibernate,开发者可以更高效地实现数据持久化,提高开发效率。

Global site tag (gtag.js) - Google Analytics