zoukankan      html  css  js  c++  java
  • 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, 精心设计的接口和类层次, 可以学到非常多东西.

  • 相关阅读:
    每个程序员都应该了解的内存知识
    关于CPU Cache -- 程序猿需要知道的那些事
    【转载】十分钟搞清字符集和字符编码
    初学 Java Web 开发,请远离各种框架,从 Servlet 开发
    XML
    接口比对象更加抽象
    【转载】Dom4j的使用(全而好的文章)
    BZOJ4870:[SHOI2017]组合数问题(组合数学,矩阵乘法)
    BZOJ1089:[SCOI2003]严格n元树(DP,高精度)
    BZOJ1259:[CQOI2007]矩形rect(DFS)
  • 原文地址:https://www.cnblogs.com/firstdream/p/2464677.html
Copyright © 2011-2022 走看看