上一篇重点介绍了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中几个关键类及接口图.
- 大小: 1.6 MB
- 描述: classDiagram.jpg
- 大小: 1.6 MB
分享到:
相关推荐
在深入探讨Hibernate源码之前,我们首先需要理解什么是对象持久化技术。对象持久化是将内存中的对象状态保存到持久存储介质(如数据库)中,以便在后续的程序运行中可以恢复这些对象的状态。它解决了应用程序中的...
源码中的`SessionImpl`类实现了该接口,我们可以看到诸如`save()`, `update()`, `delete()`, `get()`, `load()`等方法的实现细节。 3. **Criteria API**:在Hibernate 3.6.1中,Criteria API提供了一种类型安全的...
《深入剖析Hibernate 3.2源码》 Hibernate是一个开源的对象关系映射(ORM)框架,它极大地简化了Java应用程序与数据库之间的交互。本篇将深入探讨Hibernate 3.2的源码,揭示其内部机制,帮助开发者更好地理解和利用...
《深入剖析Hibernate 5.2.7源码》 Hibernate,作为Java领域中著名的对象关系映射(ORM)框架,自发布以来一直深受开发者喜爱。本文将基于Hibernate 5.2.7的源码,详细解析其核心设计理念、主要模块以及关键实现细节...
Hibernate 是一个流行的 Java ORM(对象关系映射)框架,它允许开发者使用面向对象的方式来操作数据库。在 Hibernate 中,一级缓存是默认开启的一种缓存机制,对于提高应用程序性能有着重要作用。一级缓存位于 ...
标题:hibernate源码分析一[启动过程] 在深入探讨Hibernate框架的启动过程之前,我们首先需要了解几个核心的概念和类,它们是Hibernate启动流程的基石。 ### 1. 关键类与接口 #### Environment类 `Environment`类...
Hibernate 源代码分析 (一):设计属于我的 SessionFactory 和 ConnectionProvider 在这篇文章中,我们将探讨 Hibernate 框架的源代码,了解 SessionFactory 和 ConnectionProvider 的实现机制。首先,我们需要了解 ...
源码中,`org.hibernate.Session`接口和其实现类`org.hibernate.internal.SessionImpl`是关键。 3. **查询语言(HQL)与Criteria API**:Hibernate提供了HQL(Hibernate Query Language),它是SQL的面向对象版本。...
修改了Hibernate的源码,可动态增加映射文件
《深入探索Hibernate 3.6源码:核心与实践》 Hibernate 3.6作为一款广泛应用的Java对象关系映射(ORM)框架,其源代码是开发者深入理解ORM机制、优化数据库操作的重要参考资料。该源码包“hibernate-core-3.6.0....
通过深入研究Hibernate源码,我们可以了解到其内部的工作机制,包括对象关系映射(ORM)、查询语言(HQL)处理、缓存策略等核心概念。这篇内容将详细解析Hibernate的关键组件和工作流程,帮助你深化对数据持久化框架...
比如,研究`org.hibernate.Session`接口及其主要实现类`org.hibernate.impl.SessionImpl`,了解它们如何进行持久化操作。 2. **查询语言HQL与Criteria API**:Hibernate提供了HQL(Hibernate Query Language)和...
深入研究Hibernate 4.1.5源码,不仅可以理解ORM框架的基本工作原理,还可以了解到JPA规范在Hibernate中的实现方式,以及如何优化数据库访问性能。此外,对事件系统、缓存机制的了解,有助于开发者在实际项目中进行...
《深入理解Hibernate Core 5.0.11.Final.jar:源码剖析与应用实践》 Hibernate,作为Java领域中最著名的对象关系映射(ORM)框架之一,极大地简化了数据库操作,使得开发者能够以面向对象的方式处理数据。本文将...
例如,当保存一个实体时,`org.hibernate.event.internal.DefaultSaveOrUpdateEventListener`会调用`SessionImpl`的`update`方法,进而处理一级缓存的存取。 ### 性能优化建议 1. 对于经常访问但很少改变的数据,...
- **一级缓存**: Session 的一级缓存是由其实现类 `SessionImpl` 中的 `persistenceContext` 属性所包含的一系列 Java 集合构成。这些集合用来存储通过 Session 加载的对象。当应用程序通过 Session 进行 CRUD 操作...
从上面的代码中,我们可以看到 ConnectionProvider 提供了两个主要方法:getConnection() 和 closeConnection()。getConnection() 方法负责提供 Connection 对象,而 closeConnection() 方法负责关闭 Connection ...
`Session` 缓存的实现基于其内部实现类 `SessionImpl` 中定义的一系列集合属性。这些集合属性主要包括: - **Persistent Objects Map**:用于存储持久化对象,确保每个持久化对象都有唯一的引用。 - **Transient ...