话说对 Hibernate 的吐槽很没道理,我竟无言以对

在 Java 的世界里有一些超级重量级的框架,很多 Java 开发者对它们甚至比对 JDK 本身还熟悉。没错,我说的就是 Struts、Spring 和 Hibernate,或者就把这三者称为 Java 的三剑客,传说中大名鼎鼎的 SSH。

尽管我今年只有 19 岁,但已有十好几年的 Java 开发经验,目前简历里只敢说熟悉(非精通) Java 编程语言。曾经是 Struts 和 Hibernate 的深度用户。对于 Web 框架我的轨迹是:Servlet -> Struts 1.x -> No Framework ,No Framework 其实说的不准确,应该是自己对 Servlet 或者 Filter 的一个简单封装。而在数据库访问这块轨迹是:JDBC -> Hibernate -> DbUtils。我觉得 DbUtils 说的也不准确,因为我愿意尝试各种轻量级的 ORM 框架,而 DbUtils 严格意义上并不是一个 ORM 的东西,充其量就是一个 JDBC 的工具包。

回想下当你在写各种 JDBC 程序的时候,假设一个表有 20 个字段,那么一个插入记录的方法可能就有小 30 行代码,因为有大量的 setString\setInteger 之类的方法需要调用。后来出现了 Hibernate 后感觉原来写代码也是如此的享受,之前 30 行的代码现在只需要两三行搞定!瞬间觉得腰也不酸了、腿也不疼了,一口气能写几十个方法。而 Hibernate 初期阶段同类产品并不多,iBatis 算是一个吧。当然后来大量 ORM 框架如雨后春笋般冒出已是几年以后的事了!

我记得最开始 Iteye 也就是之前的 Javaeye 早期的网站是 hibernate.org.cn ,大家都在讨论 Hibernate 的各种使用技巧。因为那个时候的 ORM 是一个非常有意思的思路,彻底解决重复编写各种 JDBC 代码的痛楚。大量的人开始学习并使用 Hibernate ,Hibernate 本身也在快速发展。任何一款软件和框架不可能满足使用者 100% 的需求,很多人适应它,有不少人不满现状去改进了,或者是使用其思路开发者各种五花八门的同类产品出来。

选择多了就有了比较,然后开始吐槽,归纳起来有这么几个槽点:

  • 太重 (的确,一个 jar 包好几兆)
  • 封装得太狠,很多问题难以直观诊断

Hibernate 现在的确是越发重了,已经俨然成为一个类似 Spring 的产品体系,例如 Hibernate ORM、Hibernate OGM、Hibernate Search 等等。而一个 Hibernate 核心 jar 包文件居然有 5M 这么大!这也是为何08年我开始开发 OSChina 时候选择放弃 Hibernate 的原因(那时候的 jar 包才两兆多),我放弃 Hibernate 的另外一个原因是: Hibernate 框架最大的优点 —— 支持多数据库平台,对 OSChina 来说没有用处,因为 OSChina 只会跑在 MySQL 数据库之上。

好了,其实我想说的是多数在吐槽 Hibernate 的人可能没注意到 Hibernate 最大的优势是什么,或者是他平时的开发过程中没有机会用到这个优势。

某些时候我们在开发一个应用的时候会要求应用可以通过简单的配置实现对不同数据库的支持,我在做 OSChina 之前有一个开源软件 —— DLOG4J,这是一个用 Java 开发的博客软件。它是一个软件,它的用户各种各样,有些希望支持 MySQL,有些希望支持 Oracle,还有 SQL Server 的。你知道数据库尽管都遵守一些通用的 SQL 标准,但又有很多各自产品的差异,就好比说分页读取记录,每个数据库的 SQL 语句写法都不同。如果你专门针对每个数据库去写这些各种的适配,烦都烦死。

而 Hibernate 在一开始就已经是解决了这个问题,通过其 Dialect 方言可方便实现对不同数据库的支持,当然这里有个大前提是你应用的代码中如果用到了原生的 SQL ,那么你需要自行保证这些 SQL 是数据库无关的。整个 DLOG4J 项目仅有 1~2 处用了 SQL 语句,其他 99% 都是直接利用 Hibernate 的 API 或者是 HQL 编写。因此你想要支持什么数据库,改个 Hibernate 的 dialect 配置即可。

如是看来平台开发 Hibernate 并非一个好选择,其一:平台一般不会随意更换数据库;其二:Hibernate 的确太重了;其三:有太多 ORM 框架可以选择(更多 ORM 框架请看这里)。而产品开发则是 Hibernate 的用武之地,毕竟客户的需求五花八门,数据库也五花八门,想省事就 Hibernate 吧。

最后我想说的是:任何一个软件都不可能满足你 100% 的需求。就好像你不能吐槽刘翔唱歌跑调,吐槽张学友跑得没你快,吐槽 @红薯 长得比你帅,是一样的道理。

时间: 2024-11-10 11:38:50

话说对 Hibernate 的吐槽很没道理,我竟无言以对的相关文章

爸妈:你的工作让我们很没面子,985本硕程序员父母的吐槽

在互联网论坛社区,一名程序员吐槽了内心的苦恼:本人985本硕,TMD产品经理,我妈是上海某国企普通员工,但每次回家我妈都要和我说我的工作让她觉得很没面子,包括她周围同事也认为去互联网行业很奇怪,很low,这种现象正常吗? 因为其母亲是国企员工,故而觉得楼主所从事的职业让其觉得没面子,面对这样的问题,有不少网友参与了回复:父母可能都不太理解去互联网的,我拿了上海某行offer之后我爹欢喜的不得了,并且认为我说干一段时间走人的想法很荒唐,父母一般都喜欢国企或公务员事业单位的吧: 我父母倒是很支持我,

很有道理的9个小故事

1/9 赵四小姐从十六岁开始跟张学良.跟一年,属奸情:跟三年,算偷情:跟六十年,便成为千古爱情! 启示: 很多事情不看做不做,而看你做多久. 2/9 民国初名妓小凤仙,如果跟了民工,就属于扫黄对象:她跟了蔡锷,则千古留芳了:倘若她跟了孙中山,那便可能成为国母. 启示: 不在于你干什么,而看你跟谁干. 3/9 女浴室起火,里面人乱作一团,赤裸身体往外跑,只见大街上白花花一大群,一老者大喊“快捂住”,众女突然醒悟,但身上要紧部位有三处,手忙脚乱捂不过来,不知所措.这时老者又大喊:“捂脸就行,下面都一

很有道理的一段话

只有永远的利益,没有永远的朋友.关系再好,谨记不要有经济上的来往. 如你所说这种关系也算了告一段落了,不要走的太近,没什么好处,如果你珍惜这段友情,那就保持若即若离. 曾经有一则寓言讲到,一群豪猪聚在一起取暖,当他们离得太远时,一点也达不到取暖的效果:而当他们靠得太近,又会被彼此的硬刺扎痛.最后只有离得不远不近,才既能取暖又能相安无事. 其实朋友之间的关系也正是这样,如果太远则有失亲近,如果太近,没有给对方留出足够的空间,则容易出现矛盾和争端. 两个人就像河岸两边,尽量保持平行,这条河才可能流的

OSChina 技术周刊第二十四期 —— C# 6.0 的新特性

每周技术抢先看,总有你想要的! 移动开发 [博客]Swift社交应用文本输入优化汇总 服务端开发/管理 [翻译]HTTP/1 的最佳实践并不适合 HTTP/2 [翻译]使用 AppDomain 存储实现大数据集合 [翻译]AngularJS 对比 React [软件]PHP 论坛软件 PHPHub [软件]监控和告警系统 Bosun [软件]多主机容器网络 SocketPlane [博客]Django学习笔记 [博客]Tornado源码分析-Web Framework [博客]话说对 Hiber

OSChina 娱乐弹弹弹——单身已久,你开始怀疑人生了吗?

周五,噢耶- 离光棍节又近了一天,看来这光棍还是得继续当下去啊 单身总是有原因的,你为啥单身? 自身原因? @grath  :20几只袜纸竟然只凑出了三对 角落还有一只鞋 另一只鞋不知道在哪里  --单身不是没有原因的 mlf_it_java : 女:法官大人,我要告他非礼. 男:冤枉啊!我没有碰过她. 法官:他怎么非礼你了? 女:我都请他吃了好几次饭了,他都不约我去开房,俗话说:来而不往非礼也,非礼也-- 法官:现判决被告还礼,满足原告要求! 男:--- 妹纸的原因? @似年  : 快到双十一

(转载)你真的理解Android AIDL中的in,out,inout么?

前言 这其实是一个很小的知识点,大部分人在使用AIDL的过程中也基本没有因为这个出现过错误,正因为它小,所以在大部分的网上关于AIDL的文章中,它都被忽视了--或者并没有,但所占篇幅甚小,且基本上都是官方文档的译文,译者读者其实都不知其然.这几天在研究AIDL,偏偏我又是个执拗的性子,遇着不清不楚的东西就是想把它捋清楚,就下了些功夫研究了下AIDL中的定向tag,研究了下它的 in , out , inout . 整理而成此博文. 1.概述 首先要说的是定向tag是AIDL语法的一部分,而 in

bzoj4825 [Hnoi2017]单旋

4825: [Hnoi2017]单旋 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 520  Solved: 247[Submit][Status][Discuss] Description H 国是一个热爱写代码的国家,那里的人们很小去学校学习写各种各样的数据结构.伸展树(splay)是一种数据 结构,因为代码好写,功能多,效率高,掌握这种数据结构成为了 H 国的必修技能.有一天,邪恶的"卡"带着 他的邪恶的"常数"

访问cv::Mat中的数据时遇到的指针类型问题

在用Opencv的时候由于下图原本的图像尺寸是1111*1111,要进行resize,代码如下: cv::Mat img = cv::imread("//Users//apple//td3//vase//19201.png",CV_LOAD_IMAGE_GRAYSCALE); cv::Mat img2; cv::resize(img, img2, cv::Size(400,400),0,0, cv::INTER_AREA); 因为我根本不知道img的数据是什么类型(不知道数据类型根本无

【MVC+MySQL+EntityFramework】查询性能优化笔记

通过在DbContext中定了表之间的关系,查询后在View中通过item.ProjectOverHour来显示关联表数据. modelBuilder.Entity<ProjectOverHour>() .HasMany(e => e.DailyReports) .WithRequired(e => e.ProjectOverHour) .HasForeignKey(e => new { e.ProjectIndex, e.EmployeeId, e.ReportDate }