上一篇重点介绍了LoadEventListener里的LoadType这个static final类及其在LoadEventListener里的定义的几个对象后,简单
地介绍了DefaultLoadEventListener里的三个static final属性,现在在这篇中将重点研究这里的onLoad方法.
进入onLoad方法后,第一句就是从event中getSession,这个返回值以SessionImplementor类型的变量保存住,如下所示:
final SessionImplementor source = event.getSession();
这里边有些蹊跷,LoadEvent类型的变量event里getSession的返回的为EventSource,而看这个EventSource是个接口,再
追着看,EventSource继承自SessionImplementor和Session两个接口,Session就是我们日常所熟悉的org.hibernate.Session接
口,那么这个SessionImplementor接口做何解释?
看这个接口的继承及实现类关系,此接口继承自Serializable,这没什么特别的;此接口有一个子接口,也就是上面所提
到的EventSource,另有一个抽象类AbstractSessionImpl实现此SessionImplementor接口,此抽象类有两个SessionImpl与
StatelessSessionImpl,这里的SessionImpl就是我们要利用的org.hibernate.Session接口的实现类.
说了半天有些绕,现在再总结下,org.hibernate.Session和SessionImplementor继承自java.io.Serializable,这两个接口下又
有一个共同的了接口EventSource,而org.hibernate.Session有一个子接口
org.hibernate.classic.Session,SessionImplementor有一个抽象实现类AbstractSessionImpl,而Hibernate自身相当重要的一
个类SessionImpl继承自AbstractSessionImpl,并同时实现了EventSource和org.hibernate.classic.Session两个接口,当然它
还实现了另一个接口org.hibernate.jdbc.JDBCContext.Context,由于现在还没有接触这个接口所涉及到的事,先不于考虑.至此
就形成了如下所示的类图(看到这个图后,一下子想起了集万千宠爱于一身这词了,呵呵,能力大责任大.).
先在这停一下,一直不明白为什么Hibernate里有org.hibernate.classic.Session这个接口,看它里面的22个方法都是
deprecated的,难道说这个接口是历史遗留问题?早与现在常见的org.hibernate.Session接口?这又说不通,若它早于
org.hibernate.Session的话,应该是org.hibernate.Session继承自org.hibernate.classic.Session,而现在正好相反.这做何
解释呢?留到日后随着对Hibernate的慢慢熟悉再来解决吧.
另外有一个问题,为什么要来一个SessionImplementor接口?心里纳闷Sesion自己就是一个接口了,怎么还又来这么个接
口还起名为SessionImplementor?这个问题从刚开始看Hibernate源码就隐隐约约地感觉到了,随着这些较为专注的研究,终于提
出这个问题,现在把整个关键接口(类)图画出后看出了点门道,准确说是一个猜想:感觉这个SessionImplementor接口有点像JDBC
里给DataBase厂商提供的那套接口,而org.hibernate.Session这个接口是Hibernate给用户用的,这也正像JDBC提供给用户用的
那套接口.现在就先做出这样的假想吧:这个SessionImplementor接口是Hibernate自己方便专门用的一个接口,用它来抽象那些
为实现org.hibernate.Session这个标准接口所要做的一些子功能.
又说的远了些,回过头来看上面提到的那外第一句.不过现在有以刚才那么几长段的分析,也就很容易明白从event中
getSession后交给一个SessionImplementor"保管"了,虽说放到event里时是已EventSource放的,但取出时也完全可以用
SessionImplementor来保管,毕竟这个SessionImplementor是EventSource的父接口之一.
现在已深夜12点了,只能明天再写关于第二句的EntityPersister persister;的EntityPersister类了.呵呵,想来有些
好笑,今天晚就写了对一句话的分析.
分享到:
相关推荐
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,作为Java领域中的一款著名持久化框架,极大地简化了数据库操作,使得开发者能够更加专注于业务逻辑。本资料主要基于“传智播客hibernate源码.rar”进行深入剖析,旨在帮助你...
《Hibernate源码解析(三)》这篇文章主要探讨了Hibernate框架的深入源码解析,这是对 Hibernate 框架理解的进一步深化。在本篇中,作者聚焦于几个关键的组件和机制,帮助读者理解 Hibernate 如何高效地管理和操作...