Hibernate 并非一无是处

红薯 发布于 2012/10/16 11:21
阅读 5K+
收藏 14

最近挺长一段时间,有很多人会喷 Hibernate,特别是 12306 被曝用 Hibernate 以来,更是喷得厉害。尽管我对“喷”这件事已经完全免疫了,没有兴趣参与,也丝毫不会激发我的一丝斗志,顶多就是笑笑而已。

今天想简单聊下 Hibernate,大概从 04 年开始就一直用 Hibernate,一直到 07 年就彻底不用了。

03 04 年似乎是 Hibernate 刚开始火的时候,那时候 ORM 的概念似乎还没有广泛普及,Hibernate 的出现让我们欢喜若狂,因为源码代码中大量的 ResultSet.getString\getInt 等代码,只需要一行代码就可以轻松搞定,DAO 代码量成倍减小,代码少,bug 就少,看起来还清爽得很。

在这期间我开发了一款开源软件 DLOG4J,原本是用于自己的博客,后来开放出去就面临了一个问题,如何同时支持多种数据库,有 MySQL、PostgreSQL、Oracle、SQL Server 等等,是个数据库都要能支持。

这个时候 Hibernate 完全展示出这方面的优越性,只需要修改配置中的 Dialect 就可以完美的切换不同的数据库。当然了,前提是 DLOG4J 里完全没有用到 数据库专属的 SQL 语句,所有的数据库操作都是直接用 ORM 的方法或者是 HQL 来编写,用 Hibernate 自带的函数,这才能保证对跨数据库平台的无缝支持。

对于建库脚本我没有用 Hibernate 的 Schema 来处理,而是用 PowerDesigner 做 CDM 概念模型,然后生成各个不同数据库平台的 PDM 物理模型,最后生成建库的 SQL 语句。

后来 Hibernate 越来越庞大,jar 包也越来越大,而且从 DLOG4J 之后,我接触的系统不再需要支持跨数据库平台的支持,这也是我为什么放弃 Hibernate 而选择一个微型数据库工具包 dbutils 的原因,因为 Hibernate 太重了。

其实现在还是有大量的项目在使用 Hibernate ,使用它并不一定因为它是最好的,可能是觉得它是最合适的,例如团队里对它最为熟悉。

今天,如果我需要开发一个同时支持多数据库平台的应用,我还是会选择 Hiberate,因为我对它很熟悉。

大家可以讲讲自己用或者不用的道理,但没必要对用或者不用的人予以抨击。

加载中
1
haitaosoft
haitaosoft

即使项目、产品要求同时支持多种数据库,涉及的存储过程还是得分别编写。

如果只是查询部分,不同的sql方言语法差别真的不大,如果不考虑优化,应该能自动转为另一个sql方言的代码。而核心价值至于优化,这样,不同数据库的优化方式就相当不同了,还是得人来写sql

JFinal
JFinal
所以跨库的意义不太大,Hibernate 最大的优势也不那么大了,还是 sql 好 :)
0
szf
szf

很中肯!

有人开车会撞墙,因此而怪那个品牌的车性能不好,这个逻辑是很怪异的。

片面地喷某种技术(特别是广泛使用的技术),很大程度上是一种某方面无知的表现,也永远达不到兼听则明的高度。

qijingq
qijingq
同意你的观点
0
Ryan-瑞恩
Ryan-瑞恩

恩,有道理。

向老大学习!


0
guxuede
guxuede
噴:魔法攻击,消耗一点魔法,50点伤害,降低15点智力,附带每小时10点毒伤害持续1天,无视魔法免疫。
0
Jacle
Jacle
爱她的优点,但是恨他的缺点:懒加载
吐槽的达达仔
吐槽的达达仔
lazy-init可以保证不需要大量获取字段数据。 因为Hibernate读取是所有字段的。 这是效率问题的一种折中啊!
szf
szf
懒加载是可选择使用的特性, 不是必须使用的。
0
q
quleap
不错。hibernate的HQL写起来可以很简洁,特别是涉及到join的时候。如果HQL不行,也可以直接调用SQL.
0
开源中国首席攻城师
开源中国首席攻城师
现在在用,感觉一些地方是方便很多。
0
子木007
子木007

现在公司的产品也在用 hibernate, 但仅限于 单表操作   (用关联关系后出问题很难hold住), 这样做也有不方便的时候,比如用HQL只能做内联接(测试下来是这样的,没问题吧?), 所以又结合了 mybatis  用于复杂点儿的查询。

前段时间刚刚从切换数据库 , 较为顺利,体现了 hibernate 的优点。 

另外,利用 EntityListeners 可以比较方便的记录数据修改痕迹。

吐槽的达达仔
吐槽的达达仔
@坑主 就是表和自己连接吗?应该可以的吧。。
子木007
子木007
回复 @坑主 : 我说的是jpa sorry , 我在测试一下
子木007
子木007
回复 @达达仔 : 单表哦,没有任何关联关系,我测试过的
吐槽的达达仔
吐槽的达达仔
谁说不能做左右连接的?
0
qijingq
qijingq
今天,如果我需要开发一个同时支持多数据库平台的应用,我还是会选择 Hiberate,因为我对它很熟悉

感觉应该是大家对都他都很熟悉。
0
林涵
林涵
倒是早期在学校写东西的时候受困于懒加载机制 ,这个session真是不好控制你关了它,就会出现延迟加载异常,不关吧session会耗尽,在哪里关 什么时候关就郁闷了 ,后来在实习的时候在一家公司使用springside,期间似乎没有遇到类似问题了,不知道这个框架是怎么样的解决方案
林涵
林涵
@达达仔 jpa只是规范而已 hibernate只是实现了这一规范,因此才能被集合进来
ajavaloser
ajavaloser
回复 @达达仔 : JPA是规范,实现还是用的hibernate
吐槽的达达仔
吐槽的达达仔
我最近也在研究SpringSide啊。。是个人开发的框架啊。。 里面使用的是JPA啊。。不是Hibernate啊。。
返回顶部
顶部