`
robbin
  • 浏览: 4836341 次
  • 性别: 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,又臭又长,极难阅读。
分享到:
评论
72 楼 ray_linn 2006-12-26  
如果HQL足够强大,那么它就走入MS LINQ的道路了,可它好像不伦不类。
71 楼 smilerain 2006-12-26  
我现在感觉和robbin差不多,Hibernate 性能太低了.

HQL发明得也不台好.
比如删除数据,竟然要先查询出来 设计这样一个方法不就行了的
session.delete(Class.class,id);
get都会做,真么就不会做删除,还有修改...

Hibernate 的二级缓存简直是垃圾.保存个ID有什么用.
用的时候又要查,和没缓存一样的效果.

最后发现还是spring 的缓存拦截器好用.

唯一的优点,可以跨数据库.


70 楼 zhipingch 2006-12-07  
呵呵,其实很多时候是我们没有真正学会用好hql
69 楼 lzzzl 2006-12-01  
Nicholas_Ding 写道
复杂的业务请写到存储过程中去,这是最高效的办法。


除非做一个公司的项目维护,产品开发是不可能这样的,现在的中间件代码就是以前的SP!
68 楼 泡泡 2006-11-29  
asd 写道
一个软件,一个技术,最重要的是可持续性吧,这几年,不仅仅hibernate,其它的开源软件为可持续性做了多少努力?不知道,我觉得不会超过10%,可能更低。
做为一名java程序员,从职业生涯的角度来说,应该了解一些更为持久的,不是昙花一现的技术,从技术的角度来说,应该了解一些低层基础一点的东西。

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


电信的项目,用什么数据库局方来定的,一个东西,在A省是Oracle到了B省就是Sybase,没有办法的事情,因为你是乙方。
67 楼 karna 2006-11-28  
wubg 写道
做报表时,用Hibernate生成一个复杂的SQL语句,真是煞费心思,左连右连痛苦,后面就只能直接用JDBC来实现,用hibernate实现对象add,update,delete是容易,但是,复杂的业务,就没法容易实现了


你不会用而已
66 楼 karna 2006-11-28  
smilelee74 写道
我觉得不爽的是如果HQL要想使用左右连接,必须先配一对多,多对多才能使用。如果不配,那就不能用。我的系统里都没配,所以碰到左右连接只能用native sql,但框架里又是设计成OO的,用native sql非常别扭。


其实呢,OQL中是不应该存在左右连接的概念的,不过HQL这点确实讨厌
65 楼 karna 2006-11-28  
zhaoyifei 写道
liuwangxia 写道
robbin 写道
2、现在极其厌恶Hibernate生成的SQL,又臭又长,极难阅读。
深有同感!
原因是要为表生成别名,还要为字段生成别名,而且当 SQL 只涉及到一张表的时候还要为表生成一个别名 this_,为每个字段生成别名 *_0_,浪费!
对了,那位热心人能将这个问题提交给 Hibernate 开发组试试看!




机器自动生成,而且还得考虑不能触犯到保留字(java sql 数据库自身),这样多的要求,还得易看!其实hibernate做得很好了,只是我们不知道他们所考虑的。


偶写过OQL的解析器,非常理解
64 楼 karna 2006-11-28  
cznc 写道
1,save(Foo f);不能通过f对象往里面传递哪些字段更新、哪些不更新;


  严重同意,其实没必要将空数据写入数据库,一般很少将数据库中的数据更新为空,这是很不好的设计

cznc 写道

2,多主键问题无主键问题(不妨假设就是没有可以为以确定对象记录的情况,sql本来就是操作集合的);

没有主键就把所有的设为主键吧
63 楼 karna 2006-11-28  
庄表伟 写道
记得以前robbin还说过,Hibernate生成的SQL,非常的优化,效率极高,非JDBC顶级高手,勿须尝试写出比Hibernate更加好的SQL。

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


这两个观点似乎不矛盾
62 楼 karna 2006-11-28  
JavaInActoin 写道
还有一个严重问题:动态性。
字段的调整是比较常见的软件维护操作,
用上Hibernate后,这个功能就不太容易实现了。
字段的调节主要涉及三个地方:数据表、JAVA实体类、映射文件。
数据表的调整比较容易实现,而JAVA类、映射文件都不大容易在运行时动态更改,即使在运行时更改了、编译了,如果不重启,也不能正常工作。
现在能想到的办法只能是预留几个字段,以备不时之需。


那么你是不是认为直接用jdbc写sql就不用改代码了?
61 楼 karna 2006-11-28  
sorphi 写道
robbin 写道
对于Hibernate,有两点值得反思:

1、...但是我的经验表明,项目中要尽量避免复杂的对象映射,这样性能很糟糕,也很容易出错,实际上我仅仅只用n:1就可以表达很多种映射模型了...
...


复杂的对象映射,源自企图用一个优美的object graph,在各层来表达实体关系。让一个业务方法返回一个Domain Entity比返回一个map, array好看得多。

downpour 写道

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


比如这个,最省力的方法就是返回一个array 好了。虽然看上去不那么OO。


当然也可以在HQL中构造java对象
60 楼 seacat 2006-11-27  
bdzhaopin 写道
Nicholas_Ding 写道
noble 写道
写到存储过程中,就和移植性考虑冲突呀。
两难的问题,其实最主要的是要定义问题场景。
在什么场景下用什么东西,实用第一。


大型应用,我接触到的电信行业,平台比较单一,Weblogic + Oracle | WebSphere + DB2,复杂的东西写到存储过程,没必要让Java去跑。如果不做通用产品,确实不需要良好的移植性。


一般以前从pb转到java的人喜欢数据库为主,实现一个功能,有时候写1000行sql,
其实java语言在逻辑性上怎么也比sql好吧,两者结合实现复杂的逻辑功能其实更好


“逻辑性”取决于程序员,与使用什么语言无关
我见过很多用Oracle PL/SQL写的package,非常的简洁、清晰,也易于维护
如果说,仅仅因为使用存储过程语言而无法将系统设计好,那么用java恐怕一样也不行
59 楼 bdzhaopin 2006-11-27  
wubg 写道
做报表时,用Hibernate生成一个复杂的SQL语句,真是煞费心思,左连右连痛苦,后面就只能直接用JDBC来实现,用hibernate实现对象add,update,delete是容易,但是,复杂的业务,就没法容易实现了

做pb系统出身得吧?思想没改过来
58 楼 DBoy 2006-09-30  
大批量更新删除如果提高效率
57 楼 efanstudio 2006-09-28  
hibernate并不是包治百病的良方,它不过是众多持久层技术实现中做的比较好的一个而已。技术永远是为应用服务的,而不是为了技术而技术。
56 楼 bdzhaopin 2006-09-27  
lszone 写道
我在做项目的时候一般是native SQL 和 HQL混合使用,如果比较复杂的SQL,用native sql比较容易调优,简单一些的查询就用HQL


同意这个看法,俺也是这么做的,不能因为Hibernate有时候不能实现一些东西或实现的不好,或是对待不熟悉它的人比较麻烦,而把Hibernate说的不好
硬件的发展速度高于软件的发展速度,软件开发最主要的是开发速度,和维护性,如果性能下降一点,升级硬件就可以解决的,硬件比起软件还是便宜的
55 楼 BirdGu 2006-09-27  
我觉得应该是对性能要求特别高,经测试无法用Java达到性能要求的才用存储过程。存储过程的优势是性能,不是处理复杂逻辑的能力。
54 楼 bdzhaopin 2006-09-27  
Nicholas_Ding 写道
noble 写道
写到存储过程中,就和移植性考虑冲突呀。
两难的问题,其实最主要的是要定义问题场景。
在什么场景下用什么东西,实用第一。


大型应用,我接触到的电信行业,平台比较单一,Weblogic + Oracle | WebSphere + DB2,复杂的东西写到存储过程,没必要让Java去跑。如果不做通用产品,确实不需要良好的移植性。


一般以前从pb转到java的人喜欢数据库为主,实现一个功能,有时候写1000行sql,
其实java语言在逻辑性上怎么也比sql好吧,两者结合实现复杂的逻辑功能其实更好
53 楼 bdzhaopin 2006-09-27  
AreYouOK? 写道
我现在觉得还是jdbc来的最直接,有什么问题无非就是调试一下sql语句。虽然有时候象是在干体力活,但是多花一分钟的时间写sql语句总比花一个小时去研究hibernate产生的奇奇怪怪的现象要划算。


jdbc大家都会,所以相对于整个团队而言,jdbc程序的可读性很好。而hibernate这种东西太复杂,每个人的掌握程度都不一样。这样,当我阅读或者修改别人的hibernate代码的时候,如果他用到了我不熟悉的功能,那么我总是要先花时间了解一下这个功能,否则当我操作对象的时候,不知道hibernate在后面做了些什么奇奇怪怪的事情,心里太没底。或许你是高手,可是当团队里别人要修改你的程序的时候,他怎么办呢?

用最简单的方式解决问题,是很有道理的。



1,jdbc可读性好,那是因为jdbc是基础,很多人都熟悉, 但是并不能因为Hibernat需要学习,有些人不 熟 悉就不用它,不熟悉要学习呀,如果因为不熟悉而不用,那就没有进步了,
我们一块合作得一个大公司,开发现在竟然还只用jsp和javaBean,我以前开发得一些taglib,都不让用,说有些人不熟悉,以后没法改,连mvc架构都不用, 整个项目jsp非常多,javascrit用的也非常多,而且功能都是用一个写一个,简直就是asp的开发样式,我要集成起来,也说怕别人看不懂,开发效率非常低,我觉得总这样就没有发展了

2,其实如果一个项目组没有很熟悉Hibernate的,我也不建议用,开始我做的一个项目,那是我刚熟悉Hibernate,因为感觉比较好,就用了,好在那个项目不是很大,不过因为中间遇到很多问题,导致出力不讨好了,不过总算完成了,自己也对Hibernate比较熟悉了,在以后的项目也有用Hiberante的,感觉开发速度快了很多,而且随着一个个项目开发,也积累了开发了一套工具,非常顺手,很多以前机械干的活现在都没有了,一旦搭起架子来,就专心实现业务,不会出现以前一些很机械的活干半天了
特别说明一下,我们开发项目 一般一个项目组4,5个人, 就我自己对Hibernate比较熟悉,其他很多是不熟悉甚至没用过的,但是我稍微指点一下,基本的操作还是都会的,当然遇到复杂些的就需要熟悉的人来解决

相关推荐

    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