我进修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只有进修之用,不能把它用在实际项目中,不然的话,你把软件卖给客户的时候,还要汇报他,你还要别的去买一个海外的软件产物,而且在海内没有技能支持,出了耐久层的问题,我们也办理不了,请你本身打国际远程去办理问题,你认为客户能承诺吗?
2、JDO不是一个轻量级封装,它试图成立一个完整的耐久层框架,可是还很不完善,造成了JDO 感受较量粗笨,许多操纵方法令人以为啰嗦和离奇。这加重了措施员进修和编程的承担,并且封装的太多会造成一个严重的问题就是一旦呈现报错信息,调试起来很是坚苦,你很难精确的定位错误毕竟出在那边,封装的越轻,问题越容易定位,越容易办理,封装的越重,问题越巨大,越找不到原因,CMP就是一个很好的例子,出了错误,调试起来很是坚苦和贫苦。
3、JDO的尺度很不完善,存在重大缺陷。最主要的问题表此刻PO不能离开PM(相当于 Hibernate的Session)而存在,这是个很是严重的问题,会造成编程的时候举办大量VO的拷贝操纵,啰嗦极了;别的一个重大缺陷是静态的 POJO的Enhancer,不能运行期动态Enhance,无法举办增量编译和调试,编程和调试起来很是啰嗦,每次都要手共运行一个东西对POJO举办 Enhance;另外尚有一些缺陷,譬喻JDOQL不完善,映射干系的表达不足强大等等。
4、JDO产物的破裂。这个问题也较量严重,由于JDO1.0尺度的缺陷,而JDO2.0尺度还遥遥无期,而各个JDO厂商为了可以或许在竞争中脱颖而出,那么除了在易操纵性和机能上的提高之外,想要吸引客户,就必需有本身的产物特色。那么1.0尺度的缺陷正好给了他们发挥的舞台,每个厂商城市有本身独到的办理方案来办理尺度的缺陷,然而这却造成了JDO 产物事实上的破裂。这种破裂严重到什么水平?我可以简朴举个例子:你写好的POJO,用一种JDO的Enhancer举办Enhance过今后获得的 PO,在另一个JDO产物上跑不起来。这很像当年Unix的破裂,功效就是二进制代码级的不兼容,而只能在C源代码级兼容。此刻的JDO也有这样的趋势,就像App Server的不同一样,一个在Weblogic上开拓好的EJB,移植到Websphere,你必然需要从头举办设置。
我心目中的ORM最好有如下的特点:
1、开源和免费的License,我可以在需要的时候研究源代码,改写源代码,举办成果的定制。
2、轻量级封装,制止引入过多巨大的问题,调试容易,也减轻措施员的承担。
3、具有可扩展性,API开放,当自己成果不足用的时候,可以本身遍码举办扩展。
4、开拓者活泼,产物有不变的成长保障。
丢弃了JDO今后,我按照上面的原则,先后解除了TopLink,CocoBase,Castor等,最后选择了Apache OJB和Hibernate。
#p#分页标题#e#
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让我出格安心,我可以或许驾御它,而不像那些过于巨大的软件,自己框架就巨大的很,再加上不开源,出了问题也不知道怎么回事。