注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

无线时代辐射无穷

抓紧生宝宝,小心辐射

 
 
 

日志

 
 

看Hibernate源码  

2009-11-10 14:13:20|  分类: hibernate |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
前一阵子用过hibernate, 觉得很激动人心(虽然工作5年, 但是没有在项目中用过, 不要笑话我), 同时也很好奇, 所以决定翻箱倒柜要看它的源代码. 先前也看过一些关于Hibernate的书, 就最著名的两本, Gavin King写的大作<<Hibernate In Action>>和<<Java Persistence with Hibernate, Revised Edition of Hibernate In Action>>. 不过看书归看书, 很多东西感觉是无法把握的, 如果翻过源代码, 哪怕是马虎潦草, 也会心底有数许多.

我看书的方式一向是"读书不求甚解", 先大概扫一眼都有些什么东西, 给自己留个大概印象, 然后再慢慢钻进去看.

做Hibernate一般是先接触配置文件(我总觉得用工具生成的配置文件不如自己写的有底), 于是过来一遍org.hibernate.mapping包, 里面是一大堆对应于配置文件的元素的定义类, 每个类的名称, 含义, 注释, 清清楚楚, 结构分明, 果然是大师手笔, 非常的"面向对象"......

好了, 按照常见的编程路线走吧. 用Hibernate的代码一般是这样写的:

new Configuration().configure().buildSessionFactory().openSession()

行, 就按照这个方式看进去.

Configuration: 顾名思义, 加载配置, 把hibernate.cfg.xml, xxx.hbm.xml以及hibernate.properties都加载起来. 加载过程非常复杂.

Configuration.buildSessionFactory: 也是非常复杂的方法, 基本上你在hibernate能见到的特性都涉及到了, 什么transaction, cache, mapping, id generator, session context, ...数不胜数. 其中还有一步SecondPassCompile, 就是在hibernate.cfg.xml, xxx.hbm.xml完毕后检查依赖关系, ID&HQL&sQL合法性等等的, 巨复杂 - -!!!

难怪Gavin King在他的书中写着"创建一个SessionFactory的代价非常昂贵"

Hibernate为每一个类生成一个ClassPersister, 这样做的好处是职责分明, 每个ClassPersister负责自己对应的类的持久化操作. 漂亮! 在创建SessionFactory的过程中, Hibernate在所有的ClassPersister对象都建立后,执行一个postInitilize的动作, 这是一个大动作, 期间会生成对应的类的select SQL, 即后来的session.load(Class,Serilizable), session.get等方法都会用到, 与我一开始想到有差别, 本以为这些SQL是在调用session.load等方法的时候才会生成.

Gavin King还提到Hibernate3 is a rewrite of Hibernate2 base on event mechanism, 大致就是这个意思, 所以在初始化SessionFactory过程中注册了大堆的event listeners.

源代码里面有大量的call back, 精心设计的接口和类层次, 可以学到非常多东西.

另外, 人家写注释的方式也可以学习一下: 简洁, 直接的描述某个类/方法做的事情, 职责.

待续...

  评论这张
 
阅读(2672)| 评论(1)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017