`
robbin
  • 浏览: 4836340 次
  • 性别: 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,又臭又长,极难阅读。
分享到:
评论
12 楼 riss 2006-09-14  
喜欢JDBC的应该会对ibatis比较感兴趣,只是写配置文件时要小心点,了解Jakarta commons下的BeanUtils和DbUtils子工程也许可以想象SQLMap是如何实现的,ibatis的源码我没看过,也许它为了追求性能使用了字节码生成或其他技术,而没有使用Java Reflection机制,都是推测,有时间再看看它的源码!

喜欢Hibernate大概是因为它为你考虑了许多你没有考虑到的,用时常会说"Hibernate真强,这个也帮我想到了,我还担心......",如果看过ORM理论上的东西,也许会深深的喜欢上Hibernate,只是它的HQL让人感觉讨厌!

哎,哪有十全十美的东西呀!?
11 楼 ddandyy 2006-09-14  
为什么不用ibatis呢  H没用过  不知道好在哪里
不过ibatis的SQL几乎就是保持原样的   看你们的说法 这个好像是和H最大的不同吧
难道这个是H的优点?
10 楼 robbin 2006-09-14  
ddandyy 写道
那robbin说说应该用哪个呢


Java的话,目前来说最好的ORM就是Hibernate了,没有太多别的选择。用Java开发项目,我选择的框架无非也就是Hibernate/Spring/Webwork
9 楼 AreYouOK? 2006-09-14  
我现在觉得还是jdbc来的最直接,有什么问题无非就是调试一下sql语句。虽然有时候象是在干体力活,但是多花一分钟的时间写sql语句总比花一个小时去研究hibernate产生的奇奇怪怪的现象要划算。

我把potian举过的例子修改下,假设你对性能感兴趣:
那么通常下hibernate会批量更新,但是A情况下就不会,A情况下如果满足B条件,它又能批量更新,不过你不能用C功能,否则它又不行,你是不是很崩溃?最后你可能要花好几个小时终于弄清楚了这个小问题,那边用jdbc做事的早就做完了。

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

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

8 楼 ddandyy 2006-09-14  
那robbin说说应该用哪个呢
7 楼 sorphi 2006-09-14  
robbin 写道
对于Hibernate,有两点值得反思:

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


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

downpour 写道

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


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

EQL, HQL, OQL这些QL的阻碍作用大于积极意义。
有一点积极意义,某些情况下简化了SQL。
比如,HQL
from Topic where user.resigertedTime > ...

对应的SQL
select topic.* from topic, user
where topic.user_id = user.id and user.resigertedTime

这种关联越深,SQL的层次就越深,甚至需要Nested Sub Query.
这个时候HQL, EQL的意义就越明显。
不过这类QL应该作为辅助工具使用,而不是强制在整个应用程序使用。

RelationAST relation = parseHQL( simpleHQL);
// do any thing you like with the HQL
String complexSQL = relation.toSQL();
//execute SQL.
5 楼 znjq 2006-09-14  
Ibatis,爽就一个字。
4 楼 liuwangxia 2006-09-14  
robbin 写道
2、现在极其厌恶Hibernate生成的SQL,又臭又长,极难阅读。
深有同感!
原因是要为表生成别名,还要为字段生成别名,而且当 SQL 只涉及到一张表的时候还要为表生成一个别名 this_,为每个字段生成别名 *_0_,浪费!
对了,那位热心人能将这个问题提交给 Hibernate 开发组试试看!
3 楼 zingers 2006-09-14  
碰到统计的话,hibernate不如jdbc甚至
我没用过ibatis,估计以后会看看
2 楼 downpour 2006-09-14  
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在这个方面却灵活的多。
1 楼 dogstar 2006-09-14  
1.我想hql的出现是为了屏蔽数据库之间sql的差异,也就是为了跨数据库。如果你直接写sql的话,难保会写一些native sql.(虽然一般我们也不会轻易换数据库)

2.估计hibernate不赞成你老阅读它的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