文档章节

深度吐槽hibernate

闲大赋
 闲大赋
发布于 2015/12/23 23:35
字数 1820
阅读 4951
收藏 87
点赞 8
评论 56

 

   hibernate 我很久都没有用了,最后一次用应该是3年前的一个企业项目,决定采用hibernate的并不是我,是我领导,我只是开发者。我所受的罪领导并不知道。正 如我的每个hibernate项目那样,每次我都是用的提心吊胆。尽管我从ejb1.1到hiberate,然后再到jpa都经历过,这种一脉相承的技术 我了解和应用了有14年,但我还是不敢声称精通OR Mapping,尤其是最近hibernate版本又都了些新概念和新Annotation,让我还觉得我是个hibernate新手:OR Mapping 也许就是个DAO错误的方向。


让我来吐槽一下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工具必须是个工具,任由开发人员使用。

© 著作权归作者所有

共有 人打赏支持
闲大赋

闲大赋

粉丝 1097
博文 86
码字总数 81146
作品 10
西城
架构师
加载中

评论(56)

闭包客
闭包客
我没有看到任何新技术可以取代 SQL,HQL 就是企图取代 SQL 而又无法达到目的尴尬产物。
beykery
beykery

引用来自“蛋看江湖”的评论

砍掉外键用hb,复杂操作分拆多个单表操作完成,懒加载,n+1直接拜拜。用不好表乱喷。mybatis发展的趋势基本是在朝着hibernate演进。一坨坨自动生成的代码。照样恶心! 如果你玩过mongo 就不会吐槽了

引用来自“闲大赋”的评论

你这么用hibernate,就叫用好了?
其实他说的没错,也只有这样用才是最简单的,使用外键是一个大坑,懒加载更是莫名其妙的巨坑。
排除外键(一对多多对多等)、懒加载,使用hql基本上还没有碰到那种sql能表达,而hql不能表达的时候。
hql其实很简单,我觉得是要比sql简单。
z
zemel
像开源中国用dbutils感觉咋样
匪徒二
匪徒二
一个操作数据库,用得着搞的这么复杂么?
闲大赋
闲大赋

引用来自“蛋看江湖”的评论

砍掉外键用hb,复杂操作分拆多个单表操作完成,懒加载,n+1直接拜拜。用不好表乱喷。mybatis发展的趋势基本是在朝着hibernate演进。一坨坨自动生成的代码。照样恶心! 如果你玩过mongo 就不会吐槽了
你这么用hibernate,就叫用好了?
蛋看江湖
蛋看江湖
砍掉外键用hb,复杂操作分拆多个单表操作完成,懒加载,n+1直接拜拜。用不好表乱喷。mybatis发展的趋势基本是在朝着hibernate演进。一坨坨自动生成的代码。照样恶心! 如果你玩过mongo 就不会吐槽了
dimdim
dimdim
不准安利4
闲大赋
闲大赋

引用来自“lanmingle”的评论

我觉得你们这些说讨厌的就没有用过nosql以及用oop去设计,哪里有你们说的那么严重。
没有人说oo不好。不过你需要处理的是关系数据库,处理的是企业,公司最重要的数据,所以得从数据库角度考虑
lanmingle
lanmingle
我觉得你们这些说讨厌的就没有用过nosql以及用oop去设计,哪里有你们说的那么严重。
小老鼠开公司
极其讨厌hb,用过再也不想再用
话说对 Hibernate 的吐槽很没道理,我竟无言以对

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

红薯 ⋅ 2015/03/06 ⋅ 77

深度学习框架大战正在进行,谁将夺取“深度学习工业标准”的荣耀?

本文最早发表于本人博客:博客 随着深度学习研究热潮的持续发酵,各种开源深度学习框架层出不穷,其中包括:Caffe、CNTK、MXNet、Neon、TensorFlow、Theano 和 Torch (著名开源深度学习框架 ...

algorithmdog ⋅ 2016/03/06 ⋅ 0

最近的状态

关于成长 又一个马年,生活似乎在这一年有了很多的变化,第一次去谦老湿家,拜见长辈。在我们都认可的地方,有了属于自己的家。似乎看起来,一切都还不错,生活也稳步的前进。 关于年龄,经历...

qingwa ⋅ 2014/03/19 ⋅ 0

12306 三天两瘫痪皆因空调系统故障

南方都市报讯 记者张东锋 昨天有网友爆料,铁道部的12306购票网站“又瘫痪了”。对此,铁道部在随后的公告中称,暂停互联网售票服务是“因机房空调系统故障”。这是继12月24日之后,该系统第...

oschina ⋅ 2012/12/27 ⋅ 89

JDBC 对象持久库--ObjectiveSync

ObjectiveSync 是简单的 JDBC 对象持久库。 它提供单个语法来抓取和更新;类似 Ruby 一样对象化 JDBC 异常处理的抓取;允许用户自定义深度抓取和更新(类似 Hibernate);提供批量处理 API,...

叶秀兰 ⋅ 2014/06/20 ⋅ 0

cannot simultaneously fetch multiple bags 异常的解决办法

异常信息如下: org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags ...... 问题是什么时候出现的呢? 当一个实体对象中包含多于一个non-lazy获取...

liangtee ⋅ 2012/10/09 ⋅ 1

Fastser-DAL刚发布后洪水般的质疑-感谢oschina

感谢大家的支持,感谢oschina,感谢@红薯 @叶秀兰 ,应大家各种问题,今天抽时间对#Fastser-DAL#进行了完善,主要是文档,该组件已经在公司各产品线使用很长时间了,最近开源出来,没想到反响...

冶卫军 ⋅ 2014/12/27 ⋅ 2

千万访问量网站架构2

看了很多人的留言,有点不靠边际,都没有意识到问题的重点在哪里,讨论的东西是个很实际的问题,很多人给的答案或者讨论的话题不靠谱,不实际,瞎说,我问这话题就是想看中国人的那种心里吗?...

mol ⋅ 2010/11/16 ⋅ 37

hibernate,mybatis,beetlsql 全面比较

这是我的一个综合评分,总共分为12个单项,每个单项最高5分,最低0分。注意,评价只包含这些软件提供的标准功能,不包含第三方提供的功能,如代码生成等。 开发效率 hibernate 能获取数据库m...

闲大赋 ⋅ 2016/02/19 ⋅ 20

学习Spring框架等技术的方向、方法和动机

学习Spring框架 最早学习Spring框架是在大二的时候,当时看了几本书,看了一些视频,主要是传智播客的。更多的,还是写代码,单独写Spring的,也有与Struts和Hibernate等框架整合的。很久以来...

jtn ⋅ 2015/04/13 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

熊掌号收录比例对于网站原创数据排名的影响[图]

从去年下半年开始,我在写博客了,因为我觉得业余写写博客也还是很不错的,但是从2017年下半年开始,百度已经推出了原创保护功能和熊掌号平台,为此,我也提交了不少以前的老数据,而这些历史...

原创小博客 ⋅ 43分钟前 ⋅ 0

LVM讲解、磁盘故障小案例

LVM LVM就是动态卷管理,可以将多个硬盘和硬盘分区做成一个逻辑卷,并把这个逻辑卷作为一个整体来统一管理,动态对分区进行扩缩空间大小,安全快捷方便管理。 1.新建分区,更改类型为8e 即L...

蛋黄Yolks ⋅ 今天 ⋅ 0

Hadoop Yarn调度器的选择和使用

一、引言 Yarn在Hadoop的生态系统中担任了资源管理和任务调度的角色。在讨论其构造器之前先简单了解一下Yarn的架构。 上图是Yarn的基本架构,其中ResourceManager是整个架构的核心组件,它负...

p柯西 ⋅ 今天 ⋅ 0

uWSGI + Django @ Ubuntu

创建 Django App Project 创建后, 可以看到路径下有一个wsgi.py的问题 uWSGI运行 直接命令行运行 利用如下命令, 可直接访问 uwsgi --http :8080 --wsgi-file dj/wsgi.py 配置文件 & 运行 [u...

袁祾 ⋅ 今天 ⋅ 0

JVM堆的理解

在JVM中,我们经常提到的就是堆了,堆确实很重要,其实,除了堆之外,还有几个重要的模块,看下图: 大 多数情况下,我们并不需要关心JVM的底层,但是如果了解它的话,对于我们系统调优是非常...

不羁之后 ⋅ 昨天 ⋅ 0

推荐:并发情况下:Java HashMap 形成死循环的原因

在淘宝内网里看到同事发了贴说了一个CPU被100%的线上故障,并且这个事发生了很多次,原因是在Java语言在并发情况下使用HashMap造成Race Condition,从而导致死循环。这个事情我4、5年前也经历...

码代码的小司机 ⋅ 昨天 ⋅ 1

聊聊spring cloud gateway的RetryGatewayFilter

序 本文主要研究一下spring cloud gateway的RetryGatewayFilter GatewayAutoConfiguration spring-cloud-gateway-core-2.0.0.RC2-sources.jar!/org/springframework/cloud/gateway/config/G......

go4it ⋅ 昨天 ⋅ 0

创建新用户和授予MySQL中的权限教程

导读 MySQL是一个开源数据库管理软件,可帮助用户存储,组织和以后检索数据。 它有多种选项来授予特定用户在表和数据库中的细微的权限 - 本教程将简要介绍一些选项。 如何创建新用户 在MySQL...

问题终结者 ⋅ 昨天 ⋅ 0

android -------- 颜色的半透明效果配置

最近有朋友问我 Android 背景颜色的半透明效果配置,我网上看资料,总结了一下, 开发中也是常常遇到的,所以来写篇博客 常用的颜色值格式有: RGB ARGB RRGGBB AARRGGBB 这4种 透明度 透明度...

切切歆语 ⋅ 昨天 ⋅ 0

CentOS开机启动subversion

建立自启动脚本: vim /etc/init.d/subversion 输入如下内容: #!/bin/bash## subversion startup script for the server## chkconfig: 2345 90 10# description: start the subve......

随风而飘 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部