hibernate:我为什么要学习Hibernate?

  在我做过很多项目过程中直有个悬而未决问题在困扰我那就是持久层开发持久层开发般来说要么用CMP要么用JDBC+DAO CMP就不用说了它对我来说是种失败实战而JDBC+DAO也存在很多困难我很难做到把关系表记录完整映射到持久对象关系上来这主要体现在多表关系无法直接映射到对持久对象映射上来可能是个表映射多个持久对象有可能是多个表映射个持久对象更有可能是表某些字段映射到个持久对象但是另外些字段映射到别持久对象上而且即使这些问题都处理好了也不能直接按照对象方式来对持久对象(PO)编程存在1:N关系持久对象查询其实就是1+n次对数据库SQL我曾经有次失败持久层设计结果是某个关联很多其它持久对象PO查询就是5n+1次 sql速度慢不得了最后不得不整个修改底层设计最后等于是完全抛弃了对象设计完全是按照表字段进行操作

  但是这样做非常难受系统设计是从需求设计系统设计这样自顶而下结果都到了详细设计阶段了被持久层映射问题限制不得不自底向上修改设计方案又回到了按照过程进行编程老路上来非常糟糕

  我对这个问题研究了很久最后终于意识到这其实是个很经典问题:对象和关系映射问题实际上自从OOP编程流行以后就存在这个难题了所以才有人提出关系数据库进行重新设计改用对象数据库但实际上关系数据库并没有被淘汰于是就只能在上层应用层找解决方案这时候我明白了我需要实际上是种 ORM产品

  我最早想到ORM就是JDO于是我下载了两个JDO产品准备认真学习但是研究了段时间的后我发现我对JDO非常失望原因如下:

  1、 JDO没有个好开源免费实现产品都是商业产品并且在国内没有销售和技术支持这就造成了JDO只有学习的用不能把它用在实际项目中否则你把软件Software卖给客户时候还要告诉他你还要另外去买个国外软件Software产品并且在国内没有技术支持出了持久层问题我们也解决不了请你自己打国际长途去解决问题你认为客户能答应吗?

  2、JDO不是个轻量级封装它试图建立个完整持久层框架但是还很不完善造成了JDO 感觉比较笨重很多操作方式令人觉得烦琐和古怪这加重了员学习和编程负担而且封装太多会造成个严重问题就是旦出现报错信息调试起来非常困难你很难准确定位究竟出在哪里封装越轻问题越容易定位越容易解决封装越重问题越复杂越找不到原因CMP就是个很好例子出了调试起来非常困难和麻烦

  3、JDO标准很不完善存在重大缺陷最主要问题体现在PO不能脱离PM(相当于 HibernateSession)而存在这是个非常严重问题会造成编程时候进行大量VO拷贝操作烦琐极了;另外个重大缺陷是静态 POJOEnhancer不能运行期动态Enhance无法进行增量编译和调试编程和调试起来非常烦琐每次都要手共运行个工具对POJO进行 Enhance;此外还有些缺陷例如JDOQL不完善映射关系表达不够强大等等

  4、JDO产品分裂这个问题也比较严重由于JDO1.0标准缺陷而JDO2.0标准还遥遥无期而各个JDO厂商为了能够在竞争中脱颖而出那么除了在易操作性和性能上提高的外想要吸引客户就必须有自己产品特色那么1.0标准缺陷正好给了他们发挥舞台每个厂商都会有自己独到解决方案来解决标准缺陷然而这却造成了JDO 产品事实上分裂这种分裂严重到什么程度?我可以简单举个例子:你写好POJO种JDOEnhancer进行Enhance过以后得到 PO在另个JDO产品上跑不起来这很像当年Unix分裂结果就是 2进制代码级不兼容而只能在C源代码级兼容现在JDO也有这样趋势就像App Server差别个在Weblogic上开发好EJB移植到Websphere定需要重新进行配置

  我心目中ORM最好有如下特点:

  1、开源和免费License我可以在需要时候研究源代码改写源代码进行功能定制

  2、轻量级封装避免引入过多复杂问题调试容易也减轻负担

  3、具有可扩展性API开放当本身功能不够用时候可以自己遍码进行扩展

  4、开发者活跃产品有稳定发展保障

  抛弃了JDO以后我根据上面原则先后排除了TopLinkCocoBaseCastor等最后选择了Apache OJB和Hibernate

  OJB排除很容易做出文档太简单太少; 2是OJB计划下个版本全面支持JDOAPI会有重大变动所以现阶段学习OJB是个等它API稳定了以后再学习不迟

  Hibernate发现是很偶然事情只是在别人提到JDO产品中附带提了提而已但当我开始研究Hibernate的后我发现终于找到了我梦寐以求ORM了

  Hibernate 完全符合我上面提到标准的外也解决掉了JDO所有缺陷而且方式的优雅令人赞叹Hibernate文档也是非常非常有特色地方它不仅仅是 Hibernate功能介绍那么简单它实际上是个持久层设计最佳实战经验整理总结文档里面例子文档里面整理总结全部都是最佳设计结晶我认真把Hibernate读下来感觉就是不单单把Hibernate掌握住了而且对持久层设计经验都长了大块以前可从来没有觉得持久层设计还有那么多学问也由此感觉到Gavin绝对是个大牛人

  当然选择Hibernate最最重用原因是Hibernate是个我能够完完全全驾驭软件SoftwareHibernate源代码非常少而且写非常简洁我总觉得挺奇怪这么少源代码能够实现这么多功能是个奇迹 Hibernate源代码树分很清楚简单源代码很易读旦碰到文档中没有讲到问题或者文档中提到但是我搞不清楚地方我就去源代码中找所有问题都豁然开朗而且让我对Hibernate运行原理和细节搞特别清楚好像Hibernate就像自己写代码很清楚知道如何写可以让Hibernate运行效率最高最省内存出了很清楚知道是什么地方问题如何解决所以用Hibernate让我特别放心我能够驾驭它而不像那些过于复杂软件Software本身框架就复杂再加上不开源出了问题也不知道如何回事

Tags:  hibernateapi hibernate分页 springhibernate hibernate

延伸阅读

最新评论

发表评论