`
robbin
  • 浏览: 4836344 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
377a9ecd-1ea1-34ac-9530-9daa53bb2a7b
robbin谈管理
浏览量:138034
社区版块
存档分类
最新评论

谈谈Hibernate令人不爽的地方

    博客分类:
  • Java
阅读更多
对于Hibernate,有两点值得反思:

1、HQL创造出来一种语言,目的是以对象方式类SQL去查询数据库,但是为什么不像rails那样,干脆直接定义COC让数据库schema 和对象的schema吻合在一起呢?这样,SQL不就是直接变成了对象查询语言了吗?缺点就是放弃更多更复杂的对象映射模型。但是我的经验表明,项目中要尽量避免复杂的对象映射,这样性能很糟糕,也很容易出错,实际上我仅仅只用n:1就可以表达很多种映射模型了。化繁为简,大巧若拙实为最高境界。

2、现在极其厌恶Hibernate生成的SQL,又臭又长,极难阅读。
分享到:
评论
52 楼 Nicholas_Ding 2006-09-25  
noble 写道
写到存储过程中,就和移植性考虑冲突呀。
两难的问题,其实最主要的是要定义问题场景。
在什么场景下用什么东西,实用第一。


大型应用,我接触到的电信行业,平台比较单一,Weblogic + Oracle | WebSphere + DB2,复杂的东西写到存储过程,没必要让Java去跑。如果不做通用产品,确实不需要良好的移植性。
51 楼 pesome 2006-09-23  
我spring jdbc,ibatis,hibernate都用过一些,就个人感受而言,如果面向数据库spring jdbc更直接,而面向对象则hibernate较为顺手。我现在项目就用的ibatis,感觉在处理对象间的关联方面不是很舒服。比如A:B是1:n,那么B对象应该有A的引用,A对象有List(或Set)<B>,使用ibatis则在B中放一个A的id,A中就没有B的list,通过get方法来获得。hibernate则能很舒服的表示他们的关系。
50 楼 noble 2006-09-23  
Nicholas_Ding 写道
复杂的业务请写到存储过程中去,这是最高效的办法。
写到存储过程中,就和移植性考虑冲突呀。
两难的问题,其实最主要的是要定义问题场景。
在什么场景下用什么东西,实用第一。
49 楼 Nicholas_Ding 2006-09-22  
复杂的业务请写到存储过程中去,这是最高效的办法。
48 楼 wubg 2006-09-21  
做报表时,用Hibernate生成一个复杂的SQL语句,真是煞费心思,左连右连痛苦,后面就只能直接用JDBC来实现,用hibernate实现对象add,update,delete是容易,但是,复杂的业务,就没法容易实现了
47 楼 ahuaxuan 2006-09-21  
robbin 写道
对于Hibernate,有两点值得反思:

1、HQL创造出来一种语言,目的是以对象方式类SQL去查询数据库,但是为什么不像rails那样,干脆直接定义COC让数据库schema 和对象的schema吻合在一起呢?这样,SQL不就是直接变成了对象查询语言了吗?缺点就是放弃更多更复杂的对象映射模型。但是我的经验表明,项目中要尽量避免复杂的对象映射,这样性能很糟糕,也很容易出错,实际上我仅仅只用n:1就可以表达很多种映射模型了。化繁为简,大巧若拙实为最高境界。

2、现在极其厌恶Hibernate生成的SQL,又臭又长,极难阅读。


感同身受啊

1, 要坚持简单的对象模型,反对使用复杂对象模型
2, hibernate生成的sql即使format后还是很难阅读
46 楼 network-eagle 2006-09-21  
simbasun 写道
不仅仅是制造话题,是有了新宠(ActiveRecord),忘了旧爱(Hibernate)..
思想随时代在变化,嘿嘿,努力在鸡蛋里面挑骨头!!!
45 楼 fixopen 2006-09-21  
没用过HQL,本来没有发言的权利,可还是忍不住想说两句。

一、OO或者不OO根本不是要考虑的问题。现在都流行DSL,还要死守着OO不放么?什么语言对了特定领域的味道,就用什么语言,SQL怎么了?SQL就是适合数据操作。(当然,我忽略了SQL的具体实现的不兼容性)。

二、各位对LINQ什么看法?我觉得似乎一下子导致各种ORM失去了阵地。而且确实比较间接直观。当然,TrustNo1曾说过LINQ不过就是Foxpro 语言的换皮,这点确实如此,但是,Linq导致了Lambda Expr,Extend Method,Type Inference等的出现,也算是有点改进,把fp中一些很好的概念拿过来了。
44 楼 simbasun 2006-09-20  
不仅仅是制造话题,是有了新宠(ActiveRecord),忘了旧爱(Hibernate)..
43 楼 adamzhao 2006-09-20  
庄表伟 写道
记得以前robbin还说过,Hibernate生成的SQL,非常的优化,效率极高,非JDBC顶级高手,勿须尝试写出比Hibernate更加好的SQL。

怎么现在就成了:“现在极其厌恶Hibernate生成的SQL,又臭又长,极难阅读。”?


Robbin在制造话题,哈~
42 楼 yhonline 2006-09-19  
downpour 写道
Hibernate在查询时,面对很多映射有时候显得很苍白。

例如有个业务场景,Department和Employee是一对多关系。现在我对Department进行分页查询,要求在显示的页面上同时显示每个Department中Employee的数量。这是一个很简单的业务场景,但是想象一下如何用hibernate进行映射?

首先否定一种做法:hql:FROM Department department。然后针对每个department,去做department.getEmployees().size()。这样不仅会发送n+1条SQL,而且性能太低。

我们肯定希望采用一句HQL解决问题,但是此时问题来了,当你试图做SELECT department, count(employee.id) FROM .....这样的HQL时,在Java端,发现没有一个合适的对象可以映射。

从OO的角度,其实可以在Department这个类中加一个employeeSize来表示这种业务场景。但是好像Hibernate无法去做类似的映射。而iBatis在这个方面却灵活的多。


在Department中做个formula映射来计算Employee的数量,当然,你的数据库要支持子查询,性能应该还可以接受。
41 楼 差沙 2006-09-19  
什么都是优点的东西不可能存在, 又优点了,相比之下必会产生缺点。

甚至说,这些优点和缺点到底是不是优点和缺点,也是随着时间地点人物在变化的。
40 楼 anders0913 2006-09-18  
asd 写道
一个软件,一个技术,最重要的是可持续性吧,这几年,不仅仅hibernate,其它的开源软件为可持续性做了多少努力?不知道,我觉得不会超过10%,可能更低。
做为一名java程序员,从职业生涯的角度来说,应该了解一些更为持久的,不是昙花一现的技术,从技术的角度来说,应该了解一些低层基础一点的东西。

ps:
来自国内某技术论坛的观点,对于一个企业级的应用系统系统来说,解决oracle8i,9i到oracle10g的需求很大,从sqlserver迁移到orcle的需求并不多。
除非:1,它不是企业级系统,2,dba那时候头脑发晕。



呵呵,深有同感!
39 楼 husthxd 2006-09-18  
downpour 写道
Hibernate在查询时,面对很多映射有时候显得很苍白。

例如有个业务场景,Department和Employee是一对多关系。现在我对Department进行分页查询,要求在显示的页面上同时显示每个Department中Employee的数量。这是一个很简单的业务场景,但是想象一下如何用hibernate进行映射?

首先否定一种做法:hql:FROM Department department。然后针对每个department,去做department.getEmployees().size()。这样不仅会发送n+1条SQL,而且性能太低。



呵呵,这种需求,建个视图不就可以了?
方便快捷.
不过,又有人说这样不够oo了.
38 楼 kentsong 2006-09-18  
Hibernate现在使用的越来越多,所以批评的也越来越多,没有这么多人的使用和批评,他也不可能有更好的发展,相信他的开发者也正在解决这些问题,大家也要有耐心阿,呵呵
37 楼 青雉 2006-09-18  
robbin 写道
ddandyy 写道
那robbin说说应该用哪个呢


Java的话,目前来说最好的ORM就是Hibernate了,没有太多别的选择。用Java开发项目,我选择的框架无非也就是Hibernate/Spring/Webwork


看来hibernate的优点还是胜过缺点的啊。
36 楼 asd 2006-09-18  
一个软件,一个技术,最重要的是可持续性吧,这几年,不仅仅hibernate,其它的开源软件为可持续性做了多少努力?不知道,我觉得不会超过10%,可能更低。
做为一名java程序员,从职业生涯的角度来说,应该了解一些更为持久的,不是昙花一现的技术,从技术的角度来说,应该了解一些低层基础一点的东西。

ps:
来自国内某技术论坛的观点,对于一个企业级的应用系统系统来说,解决oracle8i,9i到oracle10g的需求很大,从sqlserver迁移到orcle的需求并不多。
除非:1,它不是企业级系统,2,dba那时候头脑发晕。
35 楼 smilelee74 2006-09-17  
我觉得不爽的是如果HQL要想使用左右连接,必须先配一对多,多对多才能使用。如果不配,那就不能用。我的系统里都没配,所以碰到左右连接只能用native sql,但框架里又是设计成OO的,用native sql非常别扭。
34 楼 iceant 2006-09-17  
robbin 写道
对于Hibernate,有两点值得反思:

1、HQL创造出来一种语言,目的是以对象方式类SQL去查询数据库,但是为什么不像rails那样,干脆直接定义COC让数据库schema 和对象的schema吻合在一起呢?这样,SQL不就是直接变成了对象查询语言了吗?缺点就是放弃更多更复杂的对象映射模型。但是我的经验表明,项目中要尽量避免复杂的对象映射,这样性能很糟糕,也很容易出错,实际上我仅仅只用n:1就可以表达很多种映射模型了。化繁为简,大巧若拙实为最高境界。

2、现在极其厌恶Hibernate生成的SQL,又臭又长,极难阅读。


HQL 是为了在不同数据库之间做兼容的产物,它确实做了它该做的事。这一点还是很好的,只是学习 HQL 和用好它需要不少的功夫。

Hibernate 生成的SQL性能也还是可以的,只是配置对SQL语句的产生有微妙的作用。这又拉高了学习曲线。

Hibernate 一直最让我不爽的地方,是对 web redeploy 这个问题的态度。

一开始有人说 Hibernate 这个问题是因为其它第三方的包引起的,于是有人说 Hibernate 是个好产品,但是也应该谨慎使用第三方的包,要不然 Hibernate 怎么能走向成熟和专业,可是 Gavin 居然要求版主封了此人的发贴权,呵,怎么都不像是个专业人士。

在越来越多的人反映这个问题时, Hibernate Team 的人把这个问题推向了 cglib, dom4j,一开始说 cglib 的 dynamic proxy 引用了 classloader, 无法释放资源,cglib 的人说他们已经修复了这个问题,后来 Hibernate team 又说是 dom4j 有问题,dom4j 也说自己修复了这个问题。后来又说是 jakarta-common 包中有问题....无论你怎么试,最后你发现 Hibernate 就是存在 redeploy 时 OutOfMemory 的问题。

我自己以前开发过很多 web 应用,也用过 jakarta-common, dom4j 的包,虽然是有一些问题,但是这么频繁引起 redeploy 问题的我还真没遇到过。我试了 spring + hibernate + tapestry. 最后我把 hibernate.jar 去掉,一切就正常了。 spring 中也使用 cglib 啊,也使用 jakarta-common 啊为什么, spring 就不会有问题, hibernate 就有问题?

当你的产品有问题的时候,你就该站出来,承认自己是有问题,然后去解决它。这才是男人。我鄙视 hibernate 的人!!!
33 楼 arthas1982 2006-09-16  
tomcat 写道
lszone 写道
我在做项目的时候一般是native SQL 和 HQL混合使用,如果比较复杂的SQL,用native sql比较容易调优,简单一些的查询就用HQL
我也是这么干的


我觉得native sql只是个应急的方案,不是最好的方案。

相关推荐

    Hibernate入门到精通

    "Hibernate入门到精通" Hibernate 是一个基于Java的ORM(Object-Relational Mapping,对象关系映射)框架,它提供了一种简洁高效的方式来访问和操作关系数据库。下面是 Hibernate 的主要知识点: Hibernate 简介 ...

    Hibernate,hibernate笔记

    Hibernate 是一个开源的对象关系映射(ORM)框架,它允许Java开发者使用面向对象的方式来操作数据库。这个框架将数据库操作转化为对Java对象的操作,简化了数据持久化的复杂度。以下是对Hibernate的一些关键知识点的...

    hibernate显示不带?的完整sql

    综上所述,通过正确配置Hibernate的`hibernate.show_sql`、`hibernate.format_sql`以及日志框架的设置,我们可以得到不带问号的完整SQL输出,以辅助开发和调试工作。在实际项目中,可以参考上述步骤进行设置,确保你...

    hibernate 5.2.15

    hibernate 5.2.15 hibernate 5.2.15 hibernate 5.2.15 hibernate 5.2.15 hibernate 5.2.15hibernate 5.2.15

    Beginning Hibernate: For Hibernate 5

    - **Java 开发者**: 本书面向有一定 Java 和数据库经验但对 Hibernate 不熟悉的开发者。 - **对象关系映射**: 适用于希望学习如何在 Java 中实现对象关系映射的程序员。 - **新手入门**: 适合初学者快速掌握 ...

    Hibernate Spatial 4 教程

    Hibernate Spatial 4 教程 Hibernate Spatial 是一个基于 Hibernate 或 JPA 的空间几何对象数据库操作框架,提供了实现空间几何对象数据库操作的方法和配置说明。 一、 Hibernate Spatial 4 简介 Hibernate ...

    hibernate2 升级为hibernate3的需要注意的事项

    从 Hibernate2 升级到 Hibernate3 不仅仅是一次简单的版本迭代,它涉及到了多个方面的调整与优化。通过遵循上述步骤,开发者可以有效地迁移项目,利用 Hibernate3 的新特性来提升应用性能和可维护性。此外,在升级...

    hibernate关联映射详解

    hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,hibernate,包含4个说明文档,分别详细解说了hibernate...

    HIBERNATE 3.2 (1)

    HIBERNATE HIBERNATE HIBERNATE HIBERNATE

    hibernate jar包:hibernate-commons-annotations-4.0.1.Final.jar等

    Hibernate.jar包,Hibernate可以应用在任何使用JDBC的场合,包含 hibernate-commons-annotations-4.0.1.Final.jar hibernate-core-4.1.12.Final.jar hibernate-ehcache-4.1.12.Final.jar hibernate-entitymanager-...

    hibernate jar包程序文件

    hibernate-commons-annotations-4.0.1.Final.jar hibernate-core-4.1.12.Final.jar hibernate-ehcache-4.1.12.Final.jar hibernate-entitymanager-4.1.12.Final.jar hibernate-jpa-2.0-api-1.0.1.Final.jar ...

    hibernate3.zip 包含hibernate3.jar

    Hibernate3 是一个非常重要的Java持久化框架,它简化了数据库操作,使得开发人员可以更加专注于业务逻辑而不是数据库的细节。这个`hibernate3.zip`压缩包包含了`hibernate3.jar`,它是Hibernate 3版本的核心库,包含...

    Hibernate完整使用教程

    Hibernate 的创始人是 Gavin King,他是一名澳大利亚的软件开发者。Gavin King 于 2001 年创建了 Hibernate 项目,旨在提供一种简洁的方式来访问关系数据库。 POJO POJO(Plain Old Java Object)是 Java 语言中的...

    hibernate和MySQL的jar

    在描述中提到的“核心jar,亲测可用,跑demo是够用了”,这表明这些jar文件包含了运行Hibernate与MySQL交互所需的基本组件,并且已经有人验证过它们在演示或测试环境中可以正常工作。通常,这包括Hibernate的核心库...

    kingbaseV8 hibernate jdbc 驱动

    在Java开发环境中,与KingbaseV8数据库进行交互通常会用到Hibernate框架和JDBC驱动。 Hibernate是一个优秀的对象关系映射(ORM)框架,它简化了Java应用程序对数据库的操作,通过将Java对象与数据库表进行映射,...

    hibernate-release-4.1.4

    【描述】中的"hibernate的jar包"指的是Hibernate框架的运行库文件,这些JAR文件包含了Hibernate的所有核心API、实现和依赖库,如Hibernate Commons Annotations、Hibernate EntityManager、Hibernate Core等。...

    Hibernate3的依赖包

    10. **增强的性能**:通过延迟加载、批处理和缓存机制,Hibernate能够在不牺牲性能的情况下提供强大的功能。 在Eclipse中使用这些依赖包,你需要按照以下步骤操作: 1. **创建项目**:首先,在Eclipse中创建一个新...

    HibernateTools-3.2.4

    HibernateTools是Java开发人员在使用Hibernate ORM框架时的有力辅助工具集,主要目的是为了提高开发效率,简化数据库操作。在HibernateTools 3.2.4版本中,它包含了一系列的特性与插件,以支持更便捷地进行对象关系...

    hibernate5相关jar包

    例如,如果你的项目不需要JPA,就可以不包含`hibernate-entitymanager.jar`。同时,确保正确配置`hibernate.cfg.xml`或`persistence.xml`文件,指定数据库连接信息、方言、缓存策略等。理解并熟练使用这些jar包将有...

    Hibernate-Extension Middlegen-Hibernate

    《Hibernate扩展Middlegen-Hibernate:数据库到Java对象的映射神器》 在Java开发领域,Hibernate作为一种流行的Object-Relational Mapping(ORM)框架,极大地简化了数据存取操作,而Middlegen作为Hibernate的一个...

Global site tag (gtag.js) - Google Analytics