在这篇中本来是没想着画EntityPersister接口继承关系及其实现类的类图,可看着看着觉得这个继承关系很壮美,也就很想看到它的全貌,于是就有在这另一篇博客里的类图.
言归正传,来看DefaultLoadEventListener类里的load方法,这个方法里可分为如下三步:
step1,判断并处理instanceToLoad不为null时的情况.
step2,做实质的doLoad方法,返回Object类型的对象.
step3,判断step2里返回的结果,若不符合就抛出相应的异常,从而结束这一超长的get/load操作.
先看step1,这里有个event.getSession().getPersistenceContext().getEntry(event.getInstanceToLoad()) != null判断,(这个Entry是干啥的?)若不为null就抛出"attempted to load into an instance that was already associated with the session: "Message的Exception.对,从这个message也能理解了不为null也就意味着当前PersistenceContext里已有instance.也就是说这个instance与session已关联起来了,那这样先前所假想的那个refresh功能就是错的了.看下面的persister.setIdentifier()方法,我们就可以修正先前的那个关于refresh的假想,或者说是去evolve那个假说:通过设置这个instanceToLoad,我们是想把处于detached状态的对象再次绑定到session里.这不是update的功能么?难道说update在底层就是调用了这个load方法? ----> 以后做进一步的验证.
看step2的doLoad方法,这又是一个独立的方法.只能留到下一篇来详细研究了,不妨也学Hibernate里proxy概念那样,这个load方法将返回一个Object对象,也就是我们想get/load的那个对象.
下面是step3.
怎么若instanceToLoad不为null就是isOptionalInstance呢?也是说若设置了那个instanceToLoad就说明了这是一种optionalInstance.不理解.
再看下面的判断逻辑,若是optionalInstance或返回结果不能为null的话,就抛出ObjectNotFoundException.这里的"返回结果不为null"可以理解,但optionalInstance...理解了,这个isOptionalInstance也就意味着,事先已设定了那个instanceToLoad,这样即使get/load没有得到更好的结果(hit database),也不能把已有的那个给能丢了吧,估计正是出于这样的考虑,就把这个也加入ObjectNotFoundException异常的管理之内了.
有了刚才的分析,下面的这个判断也就好理解了:isOptionalInstance && entity != event.getInstanceToLoad(),也就是说,我已设置了instanceToLoad,你那边get/load到的东西就得放到这个instanceToLoad里边,不能"狸猫换太子"地给调了包,那岂不是赔大了,辛苦了半天到头来给别人做了一番嫁衣.
至些,经过上面两层的异常筛选,我们就可以返回期盼已久的entity了.
下一篇中将讨论那个真正的功臣:doLoad.
*****************************************************
这篇blog写完了,总有些意犹未尽的感觉,今天写时有些文如泉涌,呵呵,有些自夸了.思路还很清晰.总得想想/总结下原因吧,对Hibernate的研究是很漫长的过程,这个过程中的研究方法也得慢慢完善起来.
现在总结,最先进入mind里的是刚开始画出的那个类图.很直观,扫清了障碍,也更坚定了信心,心里不再疙疙瘩瘩的,可以亮堂堂地前行.这是成功的心理因素.
第二,今天下班后看救灾方面的新闻,看到了一个女子在被埋的几十个小时里把自己小腿用石块砸开,用自己的鲜血维持着生命!在感叹生命力量如此之大之震撼之余,也让我更深刻地理解了生命潜力的巨大.这样常人能以想像的行动,再发观自己呢,生活中工作中的一点麻烦事就感觉天塌了似的,这怎么行?!有了这样坚定的信念,那个类图也就画出来了,今天的分析也很是成功.
第二,分析方法有了很大的改善.就是把load方法先分为三步,而不是像往常那样,不管三七二十一上来就看.这样的化整为零很见效,事实上,大致地看了一眼这个load方法后也有些犯嘀咕.可当分为三步后,目标一下子更明淅了,心情也就更好了,最终有了后面的文如泉涌.
呵呵....
分享到:
相关推荐
hibernate源码
标题"hibernate源码 直接使用"表明我们将探讨的是Hibernate框架的源代码,以及如何直接在项目中应用这些源代码。Hibernate是一个流行的Java ORM(对象关系映射)框架,它简化了数据库操作,将数据库交互转化为面向...
接下来,我们将深入探讨Hibernate的核心概念、如何在Eclipse中导入源码以及如何利用这些源码进行学习。 1. Hibernate 核心概念: - ORM(Object-Relational Mapping):ORM是将数据库中的关系数据映射为Java对象的...
在深入研究Hibernate源码时,可以关注以下关键点: - **实体管理**:了解实体生命周期(瞬态、持久化、托管和脱管),以及状态转换的过程。 - **HQL和Criteria API**:学习如何构建面向对象的查询,以及它们与原生...
《Hibernate源码解析(一)》 在Java开发领域,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。深入理解Hibernate的源码,不仅可以帮助开发者更好地运用该工具,还能提升对Java编程和...
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”进行深入剖析,旨在帮助你...