我为什么学习Hibernate
我来谈谈我为什么学习Hibernate希望对大家能有点启发
在我做过的很多项目的过程中我一直有一个悬而未决的问题在困扰我那就是持久层的开发持久层的开发一般来说要么用CMP要么用JDBC+DAO CMP就不用说了它对我来说是一种失败的实践而JDBC+DAO也存在很多的困难我很难做到把关系表记录完整的映射到持久对象的关系上来这主要体现在多表的关系无法直接映射到对持久对象的映射上来可能是一个表映射多个持久对象有可能是多个表映射一个持久对象更有可能的是表的某些字段映射到一个持久对象但是另外一些字段映射到别的持久对象上而且即使这些问题都处理好了也不能直接按照对象的方式来对持久对象(PO)编程因为存在N关系的持久对象的查询其实就是+n次对数据库的SQL我曾经有一次失败的持久层设计结果是某个关联很多其它持久对象的PO一查询就是n+次 sql速度慢的不得了最后不得不整个修改底层设计最后等于是完全抛弃了对象设计完全是按照表字段进行操作
但是这样做非常难受因为系统的设计是从需求设计系统设计这样自顶而下的结果都到了详细设计阶段了被持久层映射问题限制不得不自底向上修改设计方案又回到了按照过程进行编程的老路上来非常的糟糕
我对这个问题思考了很久最后终于意识到这其实是一个很经典的问题对象和关系的映射问题实际上自从OOP编程流行以后就存在这个难题了所以才有人提出关系数据库进行重新设计改用对象数据库但实际上关系数据库并没有被淘汰于是就只能在上层的应用层找解决方案这时候我明白了我需要的实际上是一种 ORM产品
我最早想到的ORM就是JDO于是我下载了两个JDO产品准备认真的学习一下但是研究了一段时间之后我发现我对JDO非常的失望原因如下
JDO没有一个好的开源免费实现好的产品都是商业产品并且在国内没有销售和技术支持这就造成了JDO只有学习之用不能把它用在实际项目中否则的话你把软件卖给客户的时候还要告诉他你还要另外去买一个国外的软件产品并且在国内没有技术支持出了持久层的问题我们也解决不了请你自己打国际长途去解决问题你认为客户能答应吗?
JDO不是一个轻量级封装它试图建立一个完整的持久层框架但是还很不完善造成了JDO 感觉比较笨重很多操作方式令人觉得烦琐和古怪这加重了程序员学习和编程的负担而且封装的太多会造成一个严重的问题就是一旦出现报错信息调试起来非常困难你很难准确的定位错误究竟出在哪里封装的越轻问题越容易定位越容易解决封装的越重问题越复杂越找不到原因CMP就是一个很好的例子出了错误调试起来非常困难和麻烦
JDO的标准很不完善存在重大缺陷最主要的问题体现在PO不能脱离PM(相当于 Hibernate的Session)而存在这是个非常严重的问题会造成编程的时候进行大量VO的拷贝操作烦琐极了另外一个重大缺陷是静态的 POJO的Enhancer不能运行期动态Enhance无法进行增量编译和调试编程和调试起来非常烦琐每次都要手共运行一个工具对POJO进行 Enhance此外还有一些缺陷例如JDOQL不完善映射关系的表达不够强大等等
JDO产品的分裂这个问题也比较严重由于JDO标准的缺陷而JDO标准还遥遥无期而各个JDO厂商为了能够在竞争中脱颖而出那么除了在易操作性和性能上的提高之外想要吸引客户就必须有自己的产品特色那么标准的缺陷正好给了他们发挥的舞台每个厂商都会有自己独到的解决方案来解决标准的缺陷然而这却造成了JDO 产品事实上的分裂这种分裂严重到什么程度?我可以简单举个例子你写好的POJO用一种JDO的Enhancer进行Enhance过以后得到的 PO在另一个JDO产品上跑不起来这很像当年Unix的分裂结果就是二进制代码级的不兼容而只能在C源代码级兼容现在的JDO也有这样的趋势就像App Server的差别一样一个在Weblogic上开发好的EJB移植到Websphere你一定需要重新进行配置
我心目中的ORM最好有如下的特点
开源和免费的License我可以在需要的时候研究源代码改写源代码进行功能的定制
轻量级封装避免引入过多复杂的问题调试容易也减轻程序员的负担
具有可扩展性API开放当本身功能不够用的时候可以自己遍码进行扩展
开发者活跃产品有稳定的发展保障
抛弃了JDO以后我根据上面的原则先后排除了TopLinkCocoBaseCastor等最后选择了Apache OJB和Hibernate
OJB的排除很容易做出一是因为它的文档太简单太少二是因为OJB计划下一个版本全面支持JDO它的API会有重大变动所以现阶段学习OJB是个错误等它的API稳定了以后再学习不迟
Hibernate的发现是很偶然的事情只是在别人提到JDO的产品中附带提了提而已但当我开始研究Hibernate之后我发现终于找到了我梦寐以求的ORM了
Hibernate 完全符合我上面提到的标准之外也解决掉了JDO的所有缺陷而且方式之优雅令人赞歎Hibernate的文档也是非常非常有特色的地方它不仅仅是 Hibernate的功能介绍那么简单它实际上是一个持久层设计的最佳实践的经验总结文档里面的例子文档里面的总结全部都是最佳设计的结晶我认真的把Hibernate读下来的感觉就是不单单把Hibernate掌握住了而且对持久层的设计的经验都长了一大块以前可从来没有觉得持久层的设计还有那么多的学问也由此感觉到Gavin绝对是一个大牛人
当然选择Hibernate最最重用的原因是Hibernate是一个我能够完完全全驾驭的了的软件Hibernate的源代码非常少而且写的非常简洁我总觉得挺奇怪的这么少的源代码能够实现这么多的功能是个奇迹 Hibernate的源代码树分的很清楚简单源代码很易读我一旦碰到文档中没有讲到的问题或者文档中提到但是我搞不清楚的地方我就去源代码中找所有的问题都豁然开朗而且让我对Hibernate的运行原理和细节搞的特别清楚好像Hibernate就像自己写的代码一样很清楚的知道怎么写程序可以让Hibernate运行效率最高最省内存程序出了错误很清楚的知道是什么地方的问题怎么解决所以用Hibernate让我特别放心我能够驾驭它而不像那些过于复杂的软件本身框架就复杂的很再加上不开源出了问题也不知道怎么回事
我开办了中国Hibernate技术专业论坛
大家如果对Hibernate有兴趣可以和我来讨论