在 Java 的世界里有一些超级重量级的框架,很多 Java 开发者对它们甚至比对 JDK 本身还熟悉。没错,我说的就是 Struts、Spring 和 Hibernate,或者就把这三者称为 Java 的三剑客,传说中大名鼎鼎的 SSH。
尽管我今年只有 19 岁,但已有十好几年的 Java 开发经验,目前简历里只敢说熟悉(非精通) Java 编程语言。曾经是 Struts 和 Hibernate 的深度用户。对于 Web 框架我的轨迹是:Servlet -> Struts 1.x -> No Framework ,No Framework 其实说的不准确,应该是自己对 Servlet 或者 Filter 的一个简单封装。而在数据库访问这块轨迹是:JDBC -> Hibernate -> DbUtils。我觉得 DbUtils 说的也不准确,因为我愿意尝试各种轻量级的 ORM 框架,而 DbUtils 严格意义上并不是一个 ORM 的东西,充其量就是一个 JDBC 的工具包。
回想下当你在写各种 JDBC 程序的时候,假设一个表有 20 个字段,那么一个插入记录的方法可能就有小 30 行代码,因为有大量的 setString\setInteger 之类的方法需要调用。后来出现了 Hibernate 后感觉原来写代码也是如此的享受,之前 30 行的代码现在只需要两三行搞定!瞬间觉得腰也不酸了、腿也不疼了,一口气能写几十个方法。而 Hibernate 初期阶段同类产品并不多,iBatis 算是一个吧。当然后来大量 ORM 框架如雨后春笋般冒出已是几年以后的事了!
我记得最开始 Iteye 也就是之前的 Javaeye 早期的网站是 hibernate.org.cn ,大家都在讨论 Hibernate 的各种使用技巧。因为那个时候的 ORM 是一个非常有意思的思路,彻底解决重复编写各种 JDBC 代码的痛楚。大量的人开始学习并使用 Hibernate ,Hibernate 本身也在快速发展。任何一款软件和框架不可能满足使用者 100% 的需求,很多人适应它,有不少人不满现状去改进了,或者是使用其思路开发者各种五花八门的同类产品出来。
选择多了就有了比较,然后开始吐槽,归纳起来有这么几个槽点:
- 太重 (的确,一个 jar 包好几兆)
- 封装得太狠,很多问题难以直观诊断
Hibernate 现在的确是越发重了,已经俨然成为一个类似 Spring 的产品体系,例如 Hibernate ORM、Hibernate OGM、Hibernate Search 等等。而一个 Hibernate 核心 jar 包文件居然有 5M 这么大!这也是为何08年我开始开发 OSChina 时候选择放弃 Hibernate 的原因(那时候的 jar 包才两兆多),我放弃 Hibernate 的另外一个原因是: Hibernate 框架最大的优点 —— 支持多数据库平台,对 OSChina 来说没有用处,因为 OSChina 只会跑在 MySQL 数据库之上。
好了,其实我想说的是多数在吐槽 Hibernate 的人可能没注意到 Hibernate 最大的优势是什么,或者是他平时的开发过程中没有机会用到这个优势。
某些时候我们在开发一个应用的时候会要求应用可以通过简单的配置实现对不同数据库的支持,我在做 OSChina 之前有一个开源软件 —— DLOG4J,这是一个用 Java 开发的博客软件。它是一个软件,它的用户各种各样,有些希望支持 MySQL,有些希望支持 Oracle,还有 SQL Server 的。你知道数据库尽管都遵守一些通用的 SQL 标准,但又有很多各自产品的差异,就好比说分页读取记录,每个数据库的 SQL 语句写法都不同。如果你专门针对每个数据库去写这些各种的适配,烦都烦死。
而 Hibernate 在一开始就已经是解决了这个问题,通过其 Dialect 方言可方便实现对不同数据库的支持,当然这里有个大前提是你应用的代码中如果用到了原生的 SQL ,那么你需要自行保证这些 SQL 是数据库无关的。整个 DLOG4J 项目仅有 1~2 处用了 SQL 语句,其他 99% 都是直接利用 Hibernate 的 API 或者是 HQL 编写。因此你想要支持什么数据库,改个 Hibernate 的 dialect 配置即可。
如是看来平台开发 Hibernate 并非一个好选择,其一:平台一般不会随意更换数据库;其二:Hibernate 的确太重了;其三:有太多 ORM 框架可以选择(更多 ORM 框架请看这里)。而产品开发则是 Hibernate 的用武之地,毕竟客户的需求五花八门,数据库也五花八门,想省事就 Hibernate 吧。
最后我想说的是:任何一个软件都不可能满足你 100% 的需求。就好像你不能吐槽刘翔唱歌跑调,吐槽张学友跑得没你快,吐槽 @红薯 长得比你帅,是一样的道理。