`
sunrenen
  • 浏览: 40243 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Hibernate源码研究碎得(六)

阅读更多
从源码层面来看load与get的区别(二): Hibernate源码研究碎得(5)

接着上一篇问题的引入,本篇中我们先从Session里我们很熟悉的get(Class entityClass, Serializable id)起步.小菜这用的例子是Hibernate里自带那个,
程序的入口为下面的Java语句:
person = (Person) session.get(Person.class, 1L);

在DB中已事先插入下面一条记录:
PERSON_id age firstname  lastname
  1                0         Foozy   Beary

下面将记录下用Eclipse里用Debug跟踪时发现的很值得关注的Breakpoints:

进入Session的实现类SessionImpl后,将调用方法
get(String entityName, Serializable id)   ----(1)
其中entityName就是Person.class.getName()的值.

进入方法(1)后,将通过LoadEvent的构造方法
LoadEvent(Serializable entityId, String entityClassName, boolean isAssociationFetch, EventSource source)    ----(2)
创建一个LoadEvent对象,构造方法中传入的参数依次为,尖括号中的为通过Eclipse的Debug时Variables看到的实参值.
id<1>,entityName<events.Person>,isAssociationFetch<false>,EventSource<SessionImpl的实例引用,也就是this>

前两个参数无需说明,先看下形参isAssociationFetch对其的赋值为false,我猜想,通过这个false告诉下面代码块这个Persion类在此次get时以notAssociationFetch来进行(这时有点疑问:若想从这样get得到的Instance里获取那些与之关联的数据会怎样呢?是Hibernate会自动再到DB中去取?当然这样的再取是很不efficient的,毕竟从DB取数时最忌讳一次能获得的而要来回地折腾多次.或在某种特定的情况下--比如说想查找下这个Person对象的所有信息,想一次性地获得与Person对象关联的所有数据又该怎么来做?用get好像就不行了吧?load行吗?通过Query接口以HQL的形式?对了,在HQL里是可以写fetch这个准关键字的....看Java Persistence with Hibernate这本书时,看到了如下的一句说明:
All entity associations and collections aren't retrieved.If you access any proxied association or uninitialized collection, a second SELECT  is executed to retrieve the data on demand.

也就是说Hibernate会给那些关联的entity创建一个proxy,在默认情况下,当访问这些proxy里的数据时,Hibernate再去DB中取去相应的数据.

那是不是可以通过在xxx.hbm.xml中改变那个默认fetch策略的方式来达到利用一个简单的get方法就可以获得相关的数据呢?好像不行吧,因为到现在的创建LoadEvent对象为止,还没有看到任何读取配置信息的操作..........
).

最后一个参数EventSource没什么可说的,SessionImpl类实现了EventSource接口,不过这里顺便说下的是Hibernate大量应用了Event-Action模式.

在构造方法(2)里又调用构造方法
private LoadEvent(Serializable entityId,String entityClassName,Object instanceToLoad,LockMode lockMode,boolean isAssociationFetch,EventSource source)  ---(3)
与(2)处的构造方法相比,(3)处的构造方法又多了两个形参
Object:instanceToLoad与LockMode:lockMode
与这两个形参对应的实参都是null.这个null本身没什么可考虑的,在此值得再进一步联想的是这个instanceToLoad,既然已是一个instance了,还需要再load吗?难道说是通过这个可以达到refresh的功能?进一步看源码一探虚实.带着这个问题,利用Eclipse的"Open Call Hierarchy"功能顺藤摸瓜地看到Session中的一个load方法就是利用了这个instanceToLoad的特性,这个load是没有返回值的,这样也就暗合了基refresh的功能.

LockMode在此没什么多说的,先从Hibernate源码中把LockMode里所定义的6种限制级别列举一下,它们依次是:
NONE,READ,UPGRADE,UPGRADE_NOWAIT,WRITE,FORCE.
BYW,从这个类里可以很好地看出Java里枚举类型的雏形.在这个LoadEvent类里(更准确地说是在当前的这个private的构造方法里.),若loadMode为null时,就将其设为了值为LockMode.NONE的DEFAULT_LOCK_MODE模式.

(BTW,从LoadEvent类的构造方法的设计上也多少看出了点以后自己有用的东西:用private来修饰那个参数最多的构造方法,其余的构造方法视具体的调用而通过this结合null的方式调用那个private的.)

这样这个LoadEvent就创建出来了.

这些都是前期工作,下一篇中将看实质一点的方法
fireLoad(event, LoadEventListener.GET);

分享到:
评论

相关推荐

    hibernate源码包

    hibernate源码

    hibernate源码 直接使用

    标题"hibernate源码 直接使用"表明我们将探讨的是Hibernate框架的源代码,以及如何直接在项目中应用这些源代码。Hibernate是一个流行的Java ORM(对象关系映射)框架,它简化了数据库操作,将数据库交互转化为面向...

    hibernate 源码直接导入Eclipse

    接下来,我们将深入探讨Hibernate的核心概念、如何在Eclipse中导入源码以及如何利用这些源码进行学习。 1. Hibernate 核心概念: - ORM(Object-Relational Mapping):ORM是将数据库中的关系数据映射为Java对象的...

    Hibernate源码

    在深入研究Hibernate源码时,可以关注以下关键点: - **实体管理**:了解实体生命周期(瞬态、持久化、托管和脱管),以及状态转换的过程。 - **HQL和Criteria API**:学习如何构建面向对象的查询,以及它们与原生...

    Hibernate源码解析(一)

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

    Hibernate源码(hibernate-orm-main.zip)

    Hibernate源码(hibernate-orm-main.zip)Source Code: Hibernate ORM 是一个为应用程序、库和框架提供对象/关系映射 (ORM) 支持的库。 它还提供了 JPA 规范的实现,这是 ORM 的标准 Java 规范。

    传智播客hibernate源码

    **标题与描述解析** 标题"传智播客hibernate源码"暗示了这是一个关于Hibernate框架...通过研究这些文件,学习者可以深入了解Hibernate的工作原理,提升数据库操作的技能,并了解如何在实际项目中有效地使用Hibernate。

    hibernate源码

    《深入剖析Hibernate源码》 Hibernate,作为一款广泛使用的开源对象关系映射(ORM)框架,为...通过对源码的深入研究,我们可以更好地利用Hibernate提供的功能,优化我们的应用,同时也能为自己的项目设计提供灵感。

    精通Hibernate源码.rar

    《精通Hibernate源码》 ...通过深入研究Hibernate源码,我们可以更好地理解ORM的工作原理,从而在项目实践中更好地运用Hibernate,提高代码质量和开发效率。同时,掌握源码也有助于定制化开发,满足特定业务需求。

    Hibernate源码解析(二)

    在本篇《Hibernate源码解析(二)》中,我们将深入探讨Hibernate这一强大的Java对象关系映射(ORM)框架的内部工作原理。这篇博客旨在帮助开发者更好地理解Hibernate的核心机制,以便于更高效地利用它来处理数据库...

    hibernate源码的学习

    Hibernate是一个开源的对象关系映射(ORM)框架,它允许开发者使用Java对象来操作数据库,而无需直接编写SQL语句。...通过对"hibernate-one2many"的分析,我们可以深入研究和实践一对一和一对多关联关系的配置和操作。

    传智播客hibernate源码.rar

    《深入理解Hibernate源码》 Hibernate,作为Java领域中的一款著名持久化框架,极大地简化了数据库操作,使得开发者能够更加专注于业务逻辑。本资料主要基于“传智播客hibernate源码.rar”进行深入剖析,旨在帮助你...

    Struts,Spring,Hibernate源码包

    总之,深入学习Struts、Spring和Hibernate的源码,对于提升Java开发者的专业水平具有重要意义。这不仅涉及到了Web开发的基本原理,还涵盖了软件设计、框架构建和数据库交互等多方面的知识。通过这种方式,开发者可以...

    hibernate3源码

    Hibernate是一种Java语言下的对象关系映射解决方案。 它是使用GNU宽通用公共许可证发行的自由、开源的软件。它为面向对象的领域模型到传统的关系型数据库的映射,提供了一个使用方便的框架。Hibernate也是目前Java...

    Hibernate源码解析(三)

    《Hibernate源码解析(三)》这篇文章主要探讨了Hibernate框架的深入源码解析,这是对 Hibernate 框架理解的进一步深化。在本篇中,作者聚焦于几个关键的组件和机制,帮助读者理解 Hibernate 如何高效地管理和操作...

Global site tag (gtag.js) - Google Analytics