hibernate源码
先前也看过一些关于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, 精心设计的接口和类层次, 可以学到非常多东西.