hibernate 我好久都没有用了,最后一次用应该是3年前的一个企业项目,决定采用hibernate的并非我,是我领导,我只是开发者。我所受的罪领导并不知道。正 如个人每一个hibernate项目那样,每次我都是用的提心吊胆。尽管我从ejb1.1到hiberate,而后再到jpa都经历过,这种一脉相承的技术 我了解和应用了有14年,但我仍是不敢声称精通OR Mapping,尤为是最近hibernate版本又都了些新概念和新Annotation,让我还以为我是个hibernate新手:OR Mapping 也许就是个DAO错误的方向。 java
让我来吐槽一下hibernate这种DAO工具,并提一下我认为完美的DAO工具。
槽点一 容器设计的败笔。 系统的核心是模型,也就是JavaBean,使用hiberante的项目,JavaBean被持久化容器劫持这是第一个槽点。尽管对模型操做,在容器的 帮助下,能很快映射到数据库操做,然而,如今越多越多的DAO框架都避免设计容器,就算是JPA规范,也只声称了是个API,而再也不提持久化容器了,由于 持久化容器已经不得人心了. 如下是使用hibernate常常出现的问题(但不限于下面几个)
1 容器内,对模型的操做我不必定得映射到数据库里,可容器会强制
2 对象在容器内,一切操做都很顺利,但出了容器,会有各类hibernate异常。须知应用并不仅有hibernate。
3 修改一个对象的属性,必须先从数据库load进来,成为容器管理对象,才能修改
槽点二之hierbnate能提升生产力? 我早期接触hb,并无被所谓的容器托管Bean所吸引(上面已经说了,实际上这是个高级陷阱),我只以为之后添加,修改都只须要调用一下HB的api就 能够了,就算是查询,也貌似很方便,有load的方法。如今看来,这些功能,几乎全部的dao框架,全部公司本身的dao工具都有,我在2002年就作过 最先的dao工具,并能自动生成dao,javabean.如今,我在beetl基础上,作了更好的beetlsql,也彻底具有这种入门级功能。 吐槽hibenate并不能提升生产力,是由于其余功能提供的太容易用错和致使效率不高了,如下是hibernate效率不高的几个方面(但不限于如下俩个)
1 不可控的生成sql,每一个用过hibernate的人都见只有一次api调用,多是one2many,也多是lazylaod,但控制台满屏的输出 sql者状况,这致使性能降低,你能够说这是开发人员不精通致使的,但是,HB为何要提供这种手段让开人员走到这一步,好的工具应该为程序员提供便利, 阻止程序员犯错。
2 难以调试的HQL。若是你须要获得数据库专家支持,数据库人员会拒绝你给他的HQL,他须要的是SQL,数据库也须要的是SQL。所幸我项目中没有人打算 给DBA培训HQL语句(这太疯狂了,DBA估计会暴动),HQL在我看来就是一个很鸡肋的功能。若是纯粹是为了跨数据库平台,不一样DAO框架都有不一样方 案,好比beetlsql就共用的sql语句放一个地方,数据库特定sql语句放到指定地方.常规的翻页,序列等特性,经过方言实现类就解决了。
槽点三:annotation表达力不足, 以fetch来讲,我有的业务须要eger加载,有的业务须要lazy加载,hibernate显然作不到,惟一的解决方法就是加入更多的新 annotation来表达,若是还不作到,就让annotation具有脚本或者sql功能。可问题来了,这样的极限方式不就是咱们属性的程序语 言+sql 方式吗。 hiberante如今是5.0也许到了25.0版本后,他可能真的是一门语言+sql的工具了,但这样有什么意义呢。 我认为annotation,最多只能描述表映射就能够了。不少其余框架就是这么作的。以下是一些常常的槽点(但不限于如下三个槽点):
1 fetch 模式 根据业务来的,但annotation只能一种,我选用哪一种都不合适
2 个人数据库之间表关系并不严格(这常见),致使hibernate 都启动不了
3 我想敏捷开发,把已经肯定的作出来,但hibernate要求我有完整的模型,不然,都启动不起来
大部分其余dao框架都不会出现上面的问题。
槽点四:程序中的SQL是个重要资产,须要维护,但hibernate并无去作。HB 最先是只有xml配置文件,做者认为只要经过配置就能完成全部dao操做,可是后来发现不行,就又搞了一个HQL,结果发现HQL跟SQL彻底不能比,最 后支持Native SQL. 就算这样的演进,但HB做者仍然没有意识到SQL才是DAO的核心, 须要重点维护。 这也是Mybatis,Beetlsql框架能让你们接受并喜好的缘由。 经过Java拼接hql或者sql问题不大,无非是把数据库调试好的的几十行sql拆开拼接就行了。但这样开发效率不高,更重要的是,维护效率低,一旦业 务有改动,sql机会不得不从新在java里拼接。hibernate 原本应该像sql那样提供sql拼接,但并无,反而是mybatis,beetlsql在这方便作的很好。 愈来愈多的人意识到hibernte是个问题,从而转用了mybatis, jfinal,nutzdao,beetlsql 等这样的开源dao工具,我认为一个理想的dao工具,应该有以下功能是必须的: 1 好的dao工具,支持javabean模型 2 好的dao工具,在javabean基础上,不能干涉javabean模型 3 支持sql的维护,如像beetlsql 那样经过markdonw格式维护sql,或者像myabtis那样经过xml维护 4 支持跨数据库平台 5 简单的数据库操做无需用户开发,大部分dao工具都能作到这点,好比beetlsql支持新增,修改,根据模板修改,根据主键查询,根据模板查询等,至少40%的dao代码都不须要重写 6 代码生成,好比生成javabean,生成dao代码,生成查询sql语句等 8 dao工具并不能要求数据库彻底符合数据库高级范式,也不要求程序彻底的OO。 7 最为重要的是,dao工具必须是个工具,任由开发人员使用。