Hibernate中"亲子鉴定"
本篇中,我们来看doLoad方法,按上篇的分析方法,我们将这个方法分为三部分:
step1,loadFromSessionCache()的调用和对返回结果的判断.
step2,loadFromSecondLevelCache()的调用和对返回结果的判断.
step3,若上面两个方法的的返回值都为null的话,最后调用loadFromDatasource并返回此方法的返回值.
首先看step1,先不管loadFromDatasource这个方法的执行细节,值得注意的是并没有把结果的判断放入到loadFromDatasource方法里,而是通过判断返回值是否为REMOVED_ENTITY_MARKER或INCONSISTENT_RTN_CLASS_MARKER而分情况地做出log,虽说这两种情况下的最终返回值都是null.另一个值得注意的是虽然loadFromSessionCache可能返回null,但也并没有直接将其返回.这也算是一种编程规范吧:把方法调用及对返回的判断与方法的执行分开,这也很想对Exception的处理,有时根据需要并没有把一些异常都catch起来,而是将其抛出.
关于这个step1,还有一个很值得关注的,那就是特别注意整个系统中debug的安排,这里就特意为debug的需要而创建了两个Object类型的Marker.别的地方虽说也有将debug信息记录下来,但那都是随手而来的debug,不像这特意地绕个弯儿来照顾debug的需要.
有了对step1的分析,doLoad里的step2和step3就没什么特别了的.
下面看loadFromSessionCache方法的执行情况.
由于这里的目标很单一,也就不用再细分N多步了.
首先看第一句,SessionImplementor session = event.getSession();
值得注意的是虽然这个SessionImplementor在onLoad里就从event里获得了,但为了保持代码的精简并没有将那里取得的SessionImplementor作为参数再传到loadFromSessionCache里,而是在这个方法是重新获得,这也正是利用了"指针"的好处,想要什么时就直接获得它的"指针".
接着往下走,从sesion中getEntityUsingInterceptor,这个方法是第一次见,看对这个方法的注释发现了"calling the Interceptor if necessary"这句话.
还没有往下看以前,就觉得有些奇怪,既然这里已经取得了那个Entity为什么不直接返回呢?还要来个处理?接着往下看就发现了这样处理的高明之处:看这个get的Entity的状态,从而决定是否将其返回还是返回那个REMOVED_ENTITY_MARKER或INCONSISTENT_RTN_CLASS_MARKER, 这样的实质也就是任务注册逐层分解,同时也管理好每一次任务分配时的Message反馈,而不是把任务交给你就不管了,同时还要充分考虑到你执行当前任务时可能出现的Message反馈.
以前对EntityEntry这个类老是不能很好地理解,觉得这个名字本身起的就有些怪怪的,Entity就Entity吧,怎么还再来个Entry呢?现在结合这里的实际应用,终于有了很直观的感觉了.
这里有从oldEntry里getStatus的语句,根据这个大致就可以推断出EntityEntry一个用途,那就是Hibernate利用这个类来获得Entity里与Hibernate相关的信息,这样也就理解了Entry一词在这的作用了.
接下往下看,总觉得这段话有点意思:
if ( options.isAllowNulls() ) {
EntityPersister persister = event.getSession().getFactory().getEntityPersister( event.getEntityClassName() );
if ( ! persister.isInstance( old, event.getSession().getEntityMode() ) ) {
return INCONSISTENT_RTN_CLASS_MARKER;
}
}
先不看那个isAllowNulls的作用,下面的isInstance的判断就些不对劲,感觉夫妻俩生了孩子后不是高兴,而是马上给这个孩子做亲子鉴定!本来嘛,这个Entity就是在与之对应的EntityPersister的一手监管下取得的,而这个Entity"独立"后,竟然对这个Entity做"亲子鉴定",有这个必要吗?
当然,我的这个形象的理解是有问题的,Hibernate经过这么久的考验了,这种"亲子鉴定"真正意义上也没有发生.不过通过这个反映出以前我对EntityPersister的理解还不全,需要进一步的修正.在这里也通过这个形象点的比喻来加强对这个问题重视.
下面是另一个方法upgradeLock了,追着看了下,这个方法是从DefaulLoadEventListener的父类AbstractLockUpgradeEventListener里继承来的.
这个方法很长,只能交给下篇来研究了.
分享到:
相关推荐
hibernate源码
标题"hibernate源码 直接使用"表明我们将探讨的是Hibernate框架的源代码,以及如何直接在项目中应用这些源代码。Hibernate是一个流行的Java ORM(对象关系映射)框架,它简化了数据库操作,将数据库交互转化为面向...
接下来,我们将深入探讨Hibernate的核心概念、如何在Eclipse中导入源码以及如何利用这些源码进行学习。 1. Hibernate 核心概念: - ORM(Object-Relational Mapping):ORM是将数据库中的关系数据映射为Java对象的...
《Hibernate源码解析(一)》 在Java开发领域,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。深入理解Hibernate的源码,不仅可以帮助开发者更好地运用该工具,还能提升对Java编程和...
在深入研究Hibernate源码时,可以关注以下关键点: - **实体管理**:了解实体生命周期(瞬态、持久化、托管和脱管),以及状态转换的过程。 - **HQL和Criteria API**:学习如何构建面向对象的查询,以及它们与原生...
Hibernate源码(hibernate-orm-main.zip)Source Code: Hibernate ORM 是一个为应用程序、库和框架提供对象/关系映射 (ORM) 支持的库。 它还提供了 JPA 规范的实现,这是 ORM 的标准 Java 规范。
**标题与描述解析** 标题"传智播客hibernate源码"暗示了这是一个关于Hibernate框架...通过研究这些文件,学习者可以深入了解Hibernate的工作原理,提升数据库操作的技能,并了解如何在实际项目中有效地使用Hibernate。
《精通Hibernate源码》 ...通过深入研究Hibernate源码,我们可以更好地理解ORM的工作原理,从而在项目实践中更好地运用Hibernate,提高代码质量和开发效率。同时,掌握源码也有助于定制化开发,满足特定业务需求。
《深入剖析Hibernate源码》 Hibernate,作为一款广泛使用的开源对象关系映射(ORM)框架,为...通过对源码的深入研究,我们可以更好地利用Hibernate提供的功能,优化我们的应用,同时也能为自己的项目设计提供灵感。
在本篇《Hibernate源码解析(二)》中,我们将深入探讨Hibernate这一强大的Java对象关系映射(ORM)框架的内部工作原理。这篇博客旨在帮助开发者更好地理解Hibernate的核心机制,以便于更高效地利用它来处理数据库...
Hibernate是一个开源的对象关系映射(ORM)框架,它允许开发者使用Java对象来操作数据库,而无需直接编写SQL语句。...通过对"hibernate-one2many"的分析,我们可以深入研究和实践一对一和一对多关联关系的配置和操作。
总之,深入学习Struts、Spring和Hibernate的源码,对于提升Java开发者的专业水平具有重要意义。这不仅涉及到了Web开发的基本原理,还涵盖了软件设计、框架构建和数据库交互等多方面的知识。通过这种方式,开发者可以...
Hibernate是一种Java语言下的对象关系映射解决方案。 它是使用GNU宽通用公共许可证发行的自由、开源的软件。它为面向对象的领域模型到传统的关系型数据库的映射,提供了一个使用方便的框架。Hibernate也是目前Java...
《Hibernate源码解析(三)》这篇文章主要探讨了Hibernate框架的深入源码解析,这是对 Hibernate 框架理解的进一步深化。在本篇中,作者聚焦于几个关键的组件和机制,帮助读者理解 Hibernate 如何高效地管理和操作...
《深入理解Hibernate源码》 Hibernate,作为Java领域中的一款著名持久化框架,极大地简化了数据库操作,使得开发者能够更加专注于业务逻辑。本资料主要基于“传智播客hibernate源码.rar”进行深入剖析,旨在帮助你...