`

从源码层面来看load与get的区别(一): Hibernate源码研究碎得(5)

阅读更多


在写以前先跟着源码的执行大致地看了看这两个方法所涉及的东西,一下子感觉到对这两个方法的比较将对以后session里的众多方法乃至整个Hibernate的研究都会起到很大的促进作用,由于这两个方法所涉及的东西很多,估计能写出10篇左右的Blog,我也就不用担心这些天写Blog没什么要出手的了.

**************************************************

源码级地来看load与get的区别(一):

load and get:

引用<Java Persistence with Hibernate>中的描述,我们得知load与get方法有如下区别:
1,how they indicate that the instance could not be found.如果在DB中没有找到与给定的identifier吻合的记录时,get返回null;而load方法将抛出一个RuntimeException类型的ObjectNotFoundException. So, it's your choice what error-handling you perfer.

这个理解上没什么困难,在实际的应用中也没啥难度.

2,与上面的第一条相比更为重要是,load方法会返回一个proxy(a placeholder,BTW,这个placeholder是我对proxy一词理解的一个换词式的解释,尽管中文里对proxy的翻译是"代理",但总觉得不对味),这种情况下并没有实际地去DB中去取相应的记录.(我的疑问:没有实际的到DB中去取,那这个Proxy是从哪获得的?如何得到?Cache中?这样从Cache中得到的Proxy有什么不好的地方?除了那个很明显的可能与DB中数据不符外?)A consequence of this is that you may get an ObjectNotFoundException later, as soon as you try to access the returned placeholder and force
its initialization(我的疑问:这个得到的Proxy又会是怎么地初始化呢?上面说access the returned placeholder还好理解些,毕竟有些属性可能没有真正的值,不过即使真正的没值也不必抛出ObjectNotFoundException吧?大不了返回一个null.  是什么原因使这个proxy在初始化时抛出ObjectNotFoundException呢?)(this is also called lazy loading; we discuss load optimization in later
chapters.)

下面这句话可以很好地帮助我们来理解为什么load返回Proxy是有大大的好处的.毕竟我们会不由自主去想:Hibernate返回一个Proxy来应付差事有些不厚道!
You may ask why this option is useful—after all, you retrieve an object to access it. It’s common to obtain a persistent instance to assign it as a reference to another instance. For example, imagine that you need the item only for a single purpose: to set an association with a Comment: aComment.setForAuction(item).If this is all you plan to do with the item, a proxy will do fine; there is no need to
hit the database. In other words, when the Comment is saved, you need the foreign key value of an item inserted into the COMMENT table. The proxy of an Item provides just that: an identifier value wrapped in a placeholder that looks like the real thing.

理解是上这样了,下一篇中小菜我将试着结合源码来分析理解这两者间的区别.

3
0
分享到:
评论
2 楼 xinshaoye 2009-01-06  
load的实现是使用代理,使用了cglib
1 楼 jindw 2008-05-14  
这个问题很晦涩阿。
load 其实应该是lazyLoad。我感觉这个名字取得不好。

相关推荐

    hibernate 三种 查询 方式 load与get的区别

    本篇文章将详细解析Hibernate中的三种主要查询方式——HQL(Hibernate Query Language)、Criteria API和Query API,并着重讨论`load()`与`get()`方法的区别。 一、HQL查询 Hibernate Query Language(HQL)是...

    hibernate中get和load方法的区别

    在Java的持久化框架Hibernate中,`get`和`load`方法都是用于从数据库中获取对象,但它们之间存在一些重要的区别。理解这些差异对于优化应用程序的性能和避免潜在问题至关重要。 首先,`get`方法是直接从数据库中...

    Hibernate的get和load方法的区别

    在Hibernate源码中,`get`方法直接调用了`sessionFactory`的`load`方法,但是传递了一个额外的参数`LockMode.NONE`,这表明它不希望获取任何锁定。而`load`方法允许设置不同的锁模式,以支持并发控制。 在实际开发...

    Hibernate查询 load与get的区别及其它查询测试

    `load`和`get`方法是Hibernate中用于检索实体的两种主要方式,它们都是从Session接口中调用,但有明显的区别和各自的适用场景。 1. `load`方法: - `load`方法主要用于根据主键加载对象,它返回一个代理对象,而...

    hibernate5jar包以及源码

    2. **持久化模型**:源码中可以看到,Hibernate通过注解或XML配置文件来定义Java类为持久化实体,实现了对象与数据库表之间的映射。 3. **缓存机制**:Hibernate支持二级缓存,源码中可以深入理解其工作流程,包括...

    hibernate-3.2源码包

    5. **Session接口**:是Hibernate的核心接口,负责对象的持久化操作,如保存(save())、更新(update())、删除(delete())以及查询(load(), get())等。 6. **Transaction管理**:Hibernate支持JTA(Java ...

    Hibernate源码解析(一)

    《Hibernate源码解析(一)》 在Java开发领域,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。深入理解Hibernate的源码,不仅可以帮助开发者更好地运用该工具,还能提升对Java编程和...

    hibernate3.6.1源码

    Hibernate 是一个著名的开源Java对象关系映射(ORM)框架,它极大地简化了数据库与Java应用程序之间的交互。在本文中,我们将深入探讨Hibernate 3.6.1版本的源码,了解其内部工作原理以及关键组件的功能。 源码分析...

    hibernate入门学习笔记+源码

    5. **CRUD操作**: 插入(save()或saveOrUpdate())、更新(update())、查询(load()、get()、Criteria、HQL等)、删除(delete())。 6. **事务处理**: Hibernate支持自动和手动的事务管理,确保数据的一致性。 **...

    精通hibernate源码ch2

    在深入探讨Hibernate源码之前,我们首先需要理解什么是对象持久化技术。对象持久化是将内存中的对象状态保存到持久存储介质(如数据库)中,以便在后续的程序运行中可以恢复这些对象的状态。它解决了应用程序中的...

    hibernate-3.2源码

    4. 加载(Load/Get):根据主键从数据库中获取对象,返回持久化状态的对象。 六、查询语言 1. HQL:Hibernate查询语言,类似SQL但面向对象,可以方便地进行对象间的关联查询。 2. Criteria API:提供更灵活的查询...

    hibernate源码的学习

    2. 一对多(@OneToMany):一个实体可以对应多个其他实体,可以通过@JoinColumn或@JoinTable来指定关联表。 3. 多对一(@ManyToOne):多个实体对应一个其他实体。 4. 多对多(@ManyToMany):多个实体对应多个其他...

    hibernate_first_new项目源码

    【hibernate_first_new项目源码】是一个关于Hibernate框架学习的项目,主要涵盖了对Hibernate常用接口的详细讲解和实例应用。Hibernate是一个强大的Java持久层框架,它为开发者提供了对象关系映射(ORM)功能,使得...

    hibernate外键实现一对一双向关联关系源码

    本主题将深入探讨如何使用Hibernate实现一对一双向关联关系,并通过源码解析这一过程。 一对一双向关联关系指的是两个实体类之间存在一对一的关系,且在各自的类中都可以直接访问对方。这种关联可以通过注解或XML...

    Hibernate基础学习源码

    Hibernate 是一个广泛使用的Java语言下的对象关系映射(ORM)框架,它允许开发人员将数据库操作与业务逻辑层解耦,使代码更加简洁、高效。本资源“Hibernate基础学习源码”提供了五个不同阶段的学习示例,分别命名为...

    传智播客李勇hibernate源码1-20课

    传智播客李勇hibernate源码1-20课,目录如下:01_hibernate介绍与动手入门体验;02_hibernate入门案例的细节分析; 03_hibernate入门案例的代码优化; 04_Session接口及get|load|persist方法 05_实体对象的三种状态...

    Hibernate一对一关系源码

    综上所述,理解和掌握Hibernate中的一对一关系源码对于Java开发人员来说是至关重要的,它有助于我们编写出高效、稳定的数据库操作代码。通过深入研究源码,我们可以了解到Hibernate是如何在幕后自动管理这种关系,并...

    Hibernate电子版及源码

    5. Criteria API:一种更动态的查询方式,允许在运行时构建查询,提供了一种灵活且类型安全的查询模型。 6. 异构数据源支持:Hibernate不仅支持关系型数据库,还支持NoSQL数据库,如MongoDB,这为开发者提供了更多...

    java hibernate上课源码3

    Java Hibernate 是一个强大的持久化框架,它为Java开发者提供了便捷的方式来操作数据库,使得开发者无需编写大量的SQL语句,而是通过对象关系映射(ORM)来处理数据。在本"java hibernate上课源码3"中,我们将深入...

    java hibernate上课源码6

    Java Hibernate 是一个强大的持久化框架,它简化了Java应用程序与关系数据库之间的交互。这个"java hibernate 上课源码6"应该包含了一系列示例代码,用于教授如何在实际项目中应用Hibernate。通过深入理解这些源码,...

Global site tag (gtag.js) - Google Analytics