在这篇中本来是没想着画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中的三种主要查询方式——HQL(Hibernate Query Language)、Criteria API和Query API,并着重讨论`load()`与`get()`方法的区别。 一、HQL查询 Hibernate Query Language(HQL)是...
在Java的持久化框架Hibernate中,`get`和`load`方法都是用于从数据库中获取对象,但它们之间存在一些重要的区别。理解这些差异对于优化应用程序的性能和避免潜在问题至关重要。 首先,`get`方法是直接从数据库中...
在Hibernate源码中,`get`方法直接调用了`sessionFactory`的`load`方法,但是传递了一个额外的参数`LockMode.NONE`,这表明它不希望获取任何锁定。而`load`方法允许设置不同的锁模式,以支持并发控制。 在实际开发...
`load`和`get`方法是Hibernate中用于检索实体的两种主要方式,它们都是从Session接口中调用,但有明显的区别和各自的适用场景。 1. `load`方法: - `load`方法主要用于根据主键加载对象,它返回一个代理对象,而...
5. **Session接口**:是Hibernate的核心接口,负责对象的持久化操作,如保存(save())、更新(update())、删除(delete())以及查询(load(), get())等。 6. **Transaction管理**:Hibernate支持JTA(Java ...
Hibernate 是一个著名的开源Java对象关系映射(ORM)框架,它极大地简化了数据库与Java应用程序之间的交互。在本文中,我们将深入探讨Hibernate 3.6.1版本的源码,了解其内部工作原理以及关键组件的功能。 源码分析...
2. **持久化模型**:源码中可以看到,Hibernate通过注解或XML配置文件来定义Java类为持久化实体,实现了对象与数据库表之间的映射。 3. **缓存机制**:Hibernate支持二级缓存,源码中可以深入理解其工作流程,包括...
4. 加载(Load/Get):根据主键从数据库中获取对象,返回持久化状态的对象。 六、查询语言 1. HQL:Hibernate查询语言,类似SQL但面向对象,可以方便地进行对象间的关联查询。 2. Criteria API:提供更灵活的查询...
**hibernate入门学习笔记+源码** **一、Hibernate简介** Hibernate是一个开源的对象关系映射(ORM)框架,它简化了Java应用与数据库之间的交互。通过提供对象化的数据访问方式,Hibernate消除了传统JDBC代码中的...
在深入探讨Hibernate源码之前,我们首先需要理解什么是对象持久化技术。对象持久化是将内存中的对象状态保存到持久存储介质(如数据库)中,以便在后续的程序运行中可以恢复这些对象的状态。它解决了应用程序中的...
《Hibernate源码解析(一)》 在Java开发领域,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。深入理解Hibernate的源码,不仅可以帮助开发者更好地运用该工具,还能提升对Java编程和...
在Hibernate源码的学习过程中,我们可以深入理解ORM的工作原理,提高我们的Java开发技能,并且能够更好地优化数据库操作。 一、Hibernate核心组件 1. Configuration:配置对象,负责读取hibernate.cfg.xml文件,...
【hibernate_first_new项目源码】是一个关于Hibernate框架学习的项目,主要涵盖了对Hibernate常用接口的详细讲解和实例应用。Hibernate是一个强大的Java持久层框架,它为开发者提供了对象关系映射(ORM)功能,使得...
2. **Hibernate_02**: 在这个阶段,开发者可能学习了如何在Hibernate中使用Session接口进行数据操作,比如保存(save()或persist())、更新(update())、删除(delete())和加载(get()或load())对象。此外,还...
传智播客李勇hibernate源码1-20课,目录如下:01_hibernate介绍与动手入门体验;02_hibernate入门案例的细节分析; 03_hibernate入门案例的代码优化; 04_Session接口及get|load|persist方法 05_实体对象的三种状态...
《Hibernate电子版及源码》资源集合是一份珍贵的学习材料,专为那些渴望深入了解Java持久化框架Hibernate的开发者准备。Hibernate作为一个开源的对象关系映射(ORM)框架,它极大地简化了Java应用程序对数据库的操作...
这份资料包含的中文说明将帮助开发者更好地理解和使用Hibernate3.2,而源码则提供了深入学习和研究的宝贵资源。 1. Hibernate ORM概述: Hibernate是一种将Java对象与关系数据库进行映射的技术,它通过提供一种...
Hibernate是一个开源的对象关系映射(ORM)框架,它允许Java开发者将数据库操作转换为对象级别的操作,从而简化了数据访问层的开发。在 Hibernate 3.2 版本中,这个框架已经相当成熟,提供了丰富的功能和性能优化。...
2. **实体类和映射文件**:在Hibernate中,我们创建Java类来表示数据库中的表,通过Hibernate的XML映射文件(或注解)定义这些类与数据库表的对应关系。 3. **SessionFactory和Session**:SessionFactory是...
Java Hibernate 是一个强大的持久化框架,它简化了Java应用程序与关系数据库之间的交互。这个"java hibernate 上课源码6"应该包含了一系列示例代码,用于教授如何在实际项目中应用Hibernate。通过深入理解这些源码,...