`
wjboy49
  • 浏览: 274369 次
  • 性别: Icon_minigender_1
  • 来自: 湖南岳阳
社区版块
存档分类
最新评论

看Hibernate源码 001

    博客分类:
  • java
阅读更多

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

做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, 精心设计的接口和类层次, 可以学到非常多东西.

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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics