集万千宠爱于一身的SessionImpl:get研究(四): Hibernate源码研究碎得(8)

上一篇重点介绍了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类了.呵呵,想来有些

好笑,今天晚就写了对一句话的分析.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值