论坛首页 Java企业应用论坛

谈谈Hibernate令人不爽的地方

浏览 95646 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-09-19  
什么都是优点的东西不可能存在, 又优点了,相比之下必会产生缺点。

甚至说,这些优点和缺点到底是不是优点和缺点,也是随着时间地点人物在变化的。
0 请登录后投票
   发表时间: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的数量,当然,你的数据库要支持子查询,性能应该还可以接受。
0 请登录后投票
   发表时间:2006-09-20  
庄表伟 写道
记得以前robbin还说过,Hibernate生成的SQL,非常的优化,效率极高,非JDBC顶级高手,勿须尝试写出比Hibernate更加好的SQL。

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


Robbin在制造话题,哈~
0 请登录后投票
   发表时间:2006-09-20  
不仅仅是制造话题,是有了新宠(ActiveRecord),忘了旧爱(Hibernate)..
0 请登录后投票
   发表时间:2006-09-21  
没用过HQL,本来没有发言的权利,可还是忍不住想说两句。

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

二、各位对LINQ什么看法?我觉得似乎一下子导致各种ORM失去了阵地。而且确实比较间接直观。当然,TrustNo1曾说过LINQ不过就是Foxpro 语言的换皮,这点确实如此,但是,Linq导致了Lambda Expr,Extend Method,Type Inference等的出现,也算是有点改进,把fp中一些很好的概念拿过来了。
0 请登录后投票
   发表时间:2006-09-21  
simbasun 写道
不仅仅是制造话题,是有了新宠(ActiveRecord),忘了旧爱(Hibernate)..
思想随时代在变化,嘿嘿,努力在鸡蛋里面挑骨头!!!
0 请登录后投票
   发表时间:2006-09-21  
robbin 写道
对于Hibernate,有两点值得反思:

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

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


感同身受啊

1, 要坚持简单的对象模型,反对使用复杂对象模型
2, hibernate生成的sql即使format后还是很难阅读
0 请登录后投票
   发表时间:2006-09-21  
做报表时,用Hibernate生成一个复杂的SQL语句,真是煞费心思,左连右连痛苦,后面就只能直接用JDBC来实现,用hibernate实现对象add,update,delete是容易,但是,复杂的业务,就没法容易实现了
0 请登录后投票
   发表时间:2006-09-22  
复杂的业务请写到存储过程中去,这是最高效的办法。
0 请登录后投票
   发表时间:2006-09-23  
Nicholas_Ding 写道
复杂的业务请写到存储过程中去,这是最高效的办法。
写到存储过程中,就和移植性考虑冲突呀。
两难的问题,其实最主要的是要定义问题场景。
在什么场景下用什么东西,实用第一。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics