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

Hibernate源码研究碎得(七)

阅读更多
LoadEventListener中的LoadType


接着上一篇,我们来看方法fireLoad(event, LoadEventListener.GET);
第一个参数就是前面已经准备好的LoadEvent对象,我们重点看下第二个参数.
这个fireLoad的签名是这样的:
fireLoad(LoadEvent event, LoadType loadType)

追着看下LoadType的定义,有点吓一跳,这个类是在接口LoadEventListener中定义的一个static final类型的Class,这还真是第一次见,以前见过在普通类中定义或static或非static内部类的,一真没见过这样在接口中定义的.写动这里,有一个疑问在接口中可不可以定义一个非static也非final的类呢?当在Eclipse里写了如下的定义并保存时,Eclipse没有报错.
public interface MyInterface {
  public class MyInnerClass{
 
  }
}
Eclipse没有报错,说明这样的定义是可以的.但又禁不住多想了一下:在接口中声明属性时,编译器都会自动地给加上"public static final"来修饰的,那我在定义MyInnerClass时即使没有显式地写上"static final",编译器在编译时也会不会自动回呢? ------------- 这个问题先放这,毕竟与Hibernate有些远了,等看了相关的说明再做解释.

言归正转.
先围绕着这个LoadType里的属性往前多想一下.LoadType里有如下五个属性:
String类型的name,其余四个都是boolean类型的,依次是nakeEntityReturned,allowNulls,checkDeleted,allowProxyCreation.这四个boolean型的属性会在以后有什么用呢?nakeEntityReturned是否与allowProxyCreation有点重复?总觉得在Hibernate里只要不允许创建Proxy就是nake的了.还有这个allowNulls,这里的null是指什么?是指要load里来的对象属性是否为空(也就是是否延时加载)?还是指这个要加载的对象是否可为Proxy?这样一来又与那两allowProxyCreation的定义有冗余了.这个checkDeleted是check什么的deleted与否?这些问题的进一步澄清还得依赖以后对Hibernate更多的了解与具体应用中的细心体会,不过现在这样一想,最起码的好处是记住了LoadType里有这么四个boolean的属性.

LoadEventListener里定义了这个LoadType类后又在LoadEventListener接口中定义了几个LoadType的常量(当然是public static final的了),依次是RELOAD,GET,LOAD,IMMEDIATE_LOAD,INTERNAL_LOAD_EAGER,INTERNAL_LOAD_LAZY和INTERNAL_LOAD_NULLABLE.

值得注意的是如下两点:
1,这里的RELOAD和GET,它们的name都是"GET",所不同的另外的四个属性不同,那为什么要起相同的name呢?这里面又有什么玄机?
2,比较LOAD和GET,发现它们的allowProxyCreation属性相反:GET里为false,LOAD里为true,是否这就是为什么Session里get方法返回是实打实地从数据库里取出的数据而load只是返回一个proxy对象的根源所在?这个问题先放在这等对get和load方法比较的差不多时再回过头解释.
对LoadEventListener下的LoadType花了点时间后,下面进入fireLoad方法本身.

前两句调用errorIfClosed();checkTransactionSynchStatus();第一个方法可能抛出SessionException异常,即throw new SessionException( "Session is closed!" );这个异常可是很常见的终于知道是怎么抛出了,呵呵...第二个方法再深追就很长了,现在也不大清楚是干啥的,就先放在这.

接着往下走,从已注册的listeners中getLoadEventListeners,再通过for循环的方式依次调用LoadEventListener的onLoad,这个onLoad方法的形参也就是前面准备好的event和loadType了.

接下来进入LoadEventListener接口的实现类DefaultLoadEventListener执行onLoad方法,这样get方法就将进入实质性的执行阶段.
 
DefaultLoadEventListener中的onLoad方法的实现很长,有五十多行,只能在下一篇里详细研究了,本篇里先简单看下DefaultLoadEventListener这个类.

很好奇这个类里先定义了两个static final修饰的Object类型对象,分别命名为REMOVED_ENTITY_MARKER和INCONSISTENT_RTN_CLASS_MARKER.以前可是没见过直接new一个Object类型对象的,在Hibernate这可真是开眼了.这两个Object对象有什么用?又怎么用呢?毕竟Object里实在没有什么可以拿的出手的方法.
在DefaultLoadEventListener里搜了下后发现return语句后用到了这两个对象,那这样也就是说用Object对象来指向get到的数据了?那怎么能放到Object对象里面呢?Object本身又没有什么专门的方法,再说这两个Object对象已定义为final也就不会再利用"父类变量来指向子类实例"这一特性了. 再细看DefaultLoadEventListener类里对这两个方法的应用,也就是如下的语句:
if ( entity == REMOVED_ENTITY_MARKER ) {
    log.debug( "load request found matching entity in context, but it is scheduled for removal;       returning null" );
   return null;
}

这两Object的作用还真是与它的名字所言,就是作为Marker来用的.那为什么不像平常所见的所样定义个int类型的常量呢?噢,若这样的话与那个entity就没法比较了,不对呀,Java里不是对那些基本类型都有了封装类了吗?那基本类型的封装是在1.5中才有的,为了兼容在Hibernate里没用这个新特性?这样的解释能说的通吗?  --- 这个离Hibernate远一点的问题就先放在这,以后再回过头来看吧.

DefaultLoadEventListener类中还有一个属性:LockMode DEFAULT_LOCK_MODE = LockMode.NONE;这个是要干啥用的?搜了下本类中没有用到,再说那个LoadEvent里已有这个属性了,是要与LoadEvent里的那个属性比较?比较的话也不至于再在这声明一个DEFAULT_LOCK_MODE引用,NONE本身是一个static final修饰的,直接要来用就OK了, ... 不对,这里有点东西,NONE是一个static final的没错,不过在这LockMode.NONE这么一声明就相当于又new了一个LockMode对象,可放在这又有什么用呢?  --- 先放一放.

DefaultLoadEventListener类中除了onLoad这个接口实现方法外还有十个或private或protected的方法,都是直接或间接地被onLoad调用的,在下一篇中结合onLoad方法再细细研究.

分享到:
评论

相关推荐

    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"的分析,我们可以深入研究和实践一对一和一对多关联关系的配置和操作。

    Struts,Spring,Hibernate源码包

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

    hibernate3源码

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

    传智播客hibernate源码.rar

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

    Hibernate源码解析(三)

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

Global site tag (gtag.js) - Google Analytics