粗略看Hibernate的代码
Hibernate大名鼎鼎,我在观看奥运的期间,也抽一些时间来阅读Hibernate的源码。我并没有把Hibernate跑起来,而是直接阅读其文档和源码。以下是我的一些观点:
1、Hibernate普遍地使用了Cache,Cache这个咚咚,对于O-R Mapping来说,双刃剑。在例如论坛之类系统中,Cache的能够很显著提高性能。在ERP之类系统中,业务对象很多,数据量很大,广泛使用Cache机制,可能存在问题。这个观点,最初来自一个同事,我对此认同。
2、Hibernate的代码质量并不是很优。很多地方都可以找出一些不好多的代码风格或者比较笨的作法。比较笨的实现,例如HQL的解释,看得出,作者在编译原理的文法解释方面并不擅长。不好的代码风格,例如:InformixDialect类中的代码:
return sql.startsWith("select distinct") ? 15 : 6;
}
这是一个使用了“魔数”的典型例子。在产生SQL的过程中,使用StringBuffer可能比直接使用String相加的方式要好一些,如果构建了SQL的抽象语法树,那样可能更好。构建SQL的抽象语法树,一个好处,可以随机构建SQL,不必拘泥于顺序。不过,这些都是实现细节的问题,并非硬伤。
3、Hibernate支持多数据库的方式可行,但并不是很好的办法,而且能力有限。例如:现有的框架,要支持Oracle 8i应该是不行的。我曾经写过一篇文章介绍支持多数据的思路:
http://www.cnblogs.com/jobs/articles/22878.aspx
4、Hibernate并没有明确区分ObjectQuery和DataQuery的概念。对象的查询,目前Hinbernate的hql,我觉得抽象的不够好。Hibernate中,没有DataQuery的概念,不适合之需要数据不构造对象的情形,例如报表。
5、Hibernate非常强调作为一个O-R Mapping的Tool,对Model不够重视,并没有体现“模型驱动”和“产生式编程”的概念。如果强调“模型驱动”和“产生式编程”,应该包括三个部分:对象元数据管理、根据元数据产生代码、运行期O-R Mapping引擎。Hinbernate似乎在根据元数据产生代码方面比较弱。
6、Hibernate有一个比较Cool的功能,外连接抓取。这样能够提高多级对象的查询性能。
由于我对Hibernate了解不够深入,上述观点可能并不全面,抑或有错漏,望对Hibernate了解的朋友拍砖或者指点。