`

甚是无奈的"亲子鉴定"--Hibernate源码研究碎得(12)

阅读更多

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里继承来的.

这个方法很长,只能交给下篇来研究了.

 

 

2
1
分享到:
评论
2 楼 rmn190 2009-02-22  
搞错了, 博客里提到的是EntityEntry, 而我的回复里写的那个JavaDocs信息却是EntityKey类的, 一下子张冠李戴了. 
1 楼 rmn190 2009-02-22  
看EntityEntry类的描述: Uniquely identifies of an entity instance in a particular session by identifier.

以前想的有些问题, 说这个类描述的信息是数据库里的信息在Hibernate里缓存的id不准确. 在准确在于, 它只是Session缓存的id而不是全部缓存的id.

相关推荐

    DmDialect-for-hibernate1-5.zip

    达梦数据DmDialect-for-hibernate所有jar包,DmDialect-for-hibernate2.0、DmDialect-for-hibernate2.1、DmDialect-for-hibernate3.0、DmDialect-for-hibernate3.1、DmDialect-for-hibernate3.6、DmDialect-for-...

    DmDialect-for-hibernate4.0.zip

    本篇将详细介绍标题为"DmDialect-for-hibernate4.0.zip"的压缩包文件及其包含的两个重要组件:Dm7JdbcDriver17.jar和DmDialect-for-hibernate4.0.jar,以及它们在SpringBoot项目中的作用。 首先,SpringBoot是一个...

    spring-boot-hibernate5整合源码

    spring-boot-hibernate5 整合源码

    hibernate-jpa-2.1-api-1.0.0.final-sources.jar

    hibernate-jpa-2.1-api-1.0.0.final-sources.jar 源码 hibernate-jpa-2.1-api-1.0.0.final-sources.jar 源码

    DmDialect-for-hibernate5.3-5.3.jar

    国产达梦数据库hibernate方言包

    spring-orm-hibernate4源码

    通过对Spring-ORM-Hibernate4源码的阅读和研究,我们可以更好地理解这两个框架是如何协同工作的,以及如何优化和定制它们以适应特定的项目需求。这个源码库为开发者提供了一手的学习材料,有助于提升我们在企业级...

    hibernate-orm-4.3.9源码

    《深入剖析Hibernate ORM框架:基于hibernate-orm-4.3.9源码》 Hibernate,作为Java领域中的一款知名对象关系映射(ORM)框架,极大地简化了数据库操作,使得开发者可以更加专注于业务逻辑而不是数据库交互。本文将...

    struts2.3.7-spring3.0.0-hibernate3.6.10 整合源码

    在整合struts2.3.7-spring3.0.0-hibernate4.0.0时,发现spring3.0不支持hibernate4.0版本,后来自己整合了两套版本,一个是struts2.3.7-spring3.1.0-hibernate4.0.0,将spring升级,一个是struts2.3.7-spring3.0.0-...

    hibernate-orm-3.3源码

    本文将针对《hibernate-orm-3.3源码》进行深度解析,帮助读者理解其核心设计理念与实现机制。 一、Hibernate概述 Hibernate 是一款开源的 Java 库,它简化了数据库操作,通过将 Java 对象与数据库表之间的映射关系...

    hibernate-release-5.2.16.Final源码包

    总结,通过深入研究Hibernate 5.2.16.Final源码,结合c3p0和dom4j的使用,Web开发者不仅能提升对Hibernate框架的理解,还能掌握数据库连接管理和XML处理的技巧,从而在实际项目中更好地利用这些工具,提升开发效率和...

    xjar-agent-hibernate-v1.0.0.jar

    xjar-agent-hibernate-v1.0.0.jar下载

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

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

    孙卫琴-精通hibernate-源码-chapter1

    《孙卫琴-精通Hibernate-源码-Chapter1》是一份深入探讨Hibernate源码的教程,旨在帮助读者理解并掌握Hibernate这一强大ORM框架的核心机制。Chapter1作为整个系列的开端,通常会涵盖Hibernate的基础概念、架构设计...

    hibernate-release-5.2.10

    "hibernate-release-5.2.10" 是Hibernate的一个发行版本,这通常包含了源码、编译后的库文件、文档以及示例等资源。5.2.10版本是一个稳定版本,提供了一些bug修复和可能的新功能。对于开发者来说,这个版本意味着...

    hibernate源码release-4.1.4.Final版

    《深入剖析Hibernate 4.1.4.Final源码》 Hibernate,作为一款著名的Java对象关系映射(ORM)框架,极大地简化了Java开发者在数据库操作中的工作。它通过提供对象化的数据访问接口,使得开发者可以更加专注于业务...

    hibernate 源码直接导入Eclipse

    - 下载Hibernate源码:首先从官方网站或镜像站点下载Hibernate的源码包,如hibernate-3.6.9。 - 创建Java项目:在Eclipse中新建一个Java工程,命名为hibernate-study或类似名称。 - 导入源码:将解压后的...

    hibernate-3.2.0

    hibernate-3.2.0源码和hibernate-3.2.0所有的jar包。

    Hibernate源码

    Hibernate-annotations和Hibernate-validator则支持注解驱动的实体定义和数据验证。 2. **Hibernate EhCache集成(hibernate-ehcache)** EhCache是Hibernate的一个二级缓存插件,用于存储和检索数据,以提高性能...

Global site tag (gtag.js) - Google Analytics