您好,欢迎光临 | 我的主页 | 个人资料 | 短消息 | 好友 | 书签 | 黑名单 |
岂能尽如人意,但求无愧我心 (手机请访问 http://3g.dlog.cn/zhlmmc)

你真的需要Spring + Hibernate吗?

2007年3月20日(Tuesday) 20点44分 作者: 虫虫 天气: 心情: 挺好

你真的需要Spring + Hibernate吗?

by zhlmmc

Java领域的框架总是层出不穷,自从EJB失去了它的光环以后,Spring + Hibernate的组合红遍了世界各地。如果说View层还有别的选择的话(JSF一时半会儿统一不了江山),逻辑控制和数据访问层则已经被Spring + Hibernate统治了。SpringHibernate也就成了事实上的标准。不管新手老手,不管项目大小,必上Spring + Hibernate。看看AppFuse们吧,哪个不是X + Spring + Hibernate

我从2005年开始接触SpringHibernate,系统的学习过这两个框架。不得不承认SpringHibernate给我带来了全新的体验。AOPORM,我以前只听说过,没有实践过。这样的新技术让我兴奋了好久。然而新鲜感并不长久,用多了发现我事实上的工作量没有减少。除了代码结构上的变化以外,SpringHibernate并没有带来很多实际的好处。虽然减少了代码的耦合度,但是增加了代码的复杂度。Debug的时间反而长了,因为对这两个框架的不熟悉,很多问题找不到原因,得去google,得去发帖问。回过头来想想为什么要用这些框架呢?

PHP的人总说做JavaOver Engineering,仔细想想还是有道理的。我平时接触的大多是一些小项目,有的甚至数据库表不满10张,用SpringHibernate来开发似乎是杀鸡用牛刀了。于是我很快抛弃了Spring,因为我发现SpringIoCAOP对我来说真的是没什么实际作用(那个xml文件维护起来很麻烦),除了让我感觉自己跟上了时代的潮流以外。我留着Hibernate是因为我懒,MyEclipse帮我自动生成的数据访问层还是挺好用的,我写不来SQL语句了。但是好景不长,我发现我又错了。Hibernate给我带来的方便似乎还不够弥补他带来的麻烦:

<[if !supportLists]>1. <[endif]>程序数据和数据库不同步

明明页面上的数据改了,可是数据库里没有。为了这一点我一直想把Hibernate所有的Session都禁用了,但这是不可能的。Session里面的东西不是你能控制的,不管你怎么flush,数据就是不同步。反过来就更不用想了,手工改了数据库Hibernate是不可能认识的。

<[if !supportLists]>2. <[endif]>查询麻烦,特别是夸表的join查询

有时候一个where语句就能实现的简单功能,要循环几次才能拿到那个对象(当然可以用HQL,我太懒,SQL都没学好那)

<[if !supportLists]>3. <[endif]>Lazy Load对于小系统就是鸡肋

明明数据库里有,但是Hibernate就是没有,明明拿到了一个对象,但是里面什么都没有,傻眼了吧。虽然这个问题可能是自己的配置文件或代码没写好,但确实挺令人心烦的。

<[if !supportLists]>4. <[endif]>更改数据库的代价太大了

有多少系统是按照软工标准来的?开发到一半来修改数据库也是难免的。这时候就得万分小心了。牵一发而动全身啊!修改XML,修改Model,甚至修改DAO。我不才,想不到好的解决办法。这个问题让我开始对Hibernate望而却步。

SpringHibernate都是好东西,但也不是万能的。小系统用这些就是累赘了,得不偿失。虽说Spring + Hibernate已经是轻量级的实现了。但我似乎需要一个更轻量级的工具。

前些天研究过一个PHP的框架CodeIgniter,不得不说PHP真的是一门为做网页而生的语言,LAMP有今天的局面也是必然。PHPJava整个架构就不一样,所以框架也没有什么可比性,但我想要说的是CodeIgniter提供的Database模块。它设计的思路就和Java的完全不一样,十分简单,但很好用。举两个例子吧(PHP语言描述,我想会用SpringHibernate的人应该都能看懂):

<[if !supportLists]>1. <[endif]>查询: 

$sql = "select * from user where username=? and password=?"

$query = $this->db->query($sql, array($name, $pwd));

if ($query->num_rows() > 0)

       {

          foreach ($query->result() as $row)

          {

             echo $row->first_name;//firs_tname是数据库字段名

             echo $row->last_name;

          }

}

<[if !supportLists]>2. <[endif]>插入: 

$data = array(

               'title' => $title,

               'name' => $name,

               'date' => $date

            );//这里的array相当于Java里面的map

$this->db->insert('mytable', $data);

<[if !supportLists]>3. <[endif]>更新: 

$data = array(

               'title' => $title,

               'name' => $name,

               'date' => $date

            );

$this->db->where('id', $artical_id);

$this->db->update('artical', $data);

<[if !supportLists]>4. <[endif]>删除:

同上

当然功能还不止这些,我只是列举了一些常用的。这样的用法和类库我以前的确没有见到过。如果Java能提供这样一个操作数据库的类库一定会很方便。但是我没有找到Java有类似的东东,大概是我孤陋寡闻吧。我想要自己写一个,应该不是很难。

万事都有两面性,Spring + Hibernate是很伟大,但他们不能满足每一个人的需要。在我看来小项目(直观的来说,数据库表少于15张)根本不需要这些,用直接的易于理解的方式去做会有更高的效率。强大的工具不一定是适合的工具,Spring + Hibernate真的适合你吗?

通过电脑发布 #1楼 评论时间:2007-3-20 21:22 (Tuesday)
我倒觉得Hibernate没有你说的那些缺点 spring我从来没想过要用 因为摆明了是一个将简单问题复杂化的东西
 
通过电脑发布 #2楼 评论时间:2007-3-20 22:00 (Tuesday)
Hibernate对于大系统来讲是好用的啊。但是它学习成本高,而且我觉得事务,缓存之类的对于小系统就是鸡肋
邮箱 |  
通过电脑发布 #3楼 评论时间:2007-3-21 03:32 (Wednesday)
Yu
从我的“小系统”验证了- -
 
通过电脑发布 #4楼 评论时间:2007-3-21 07:49 (Wednesday)
准确性 安全性 高效是任何系统都应该俱备的 大小系统只能以业务的复杂度来划分
 
通过电脑发布 #5楼 评论时间:2007-3-21 17:09 (Wednesday)
“ 准确性 安全性 高效是任何系统都应该俱备的 大小系统只能以业务的复杂度来划分” 不错。但我觉得Hibernate带来的ORM并不适合小系统。原始的JDBC去连数据库,写SQL语句就够了。如果有一个数据库包来帮助访问(比如我文中提到的那种),那也会很方便。ORM的思想很好,的确让人兴奋,但带来的复杂性也是不可避免的。
邮箱 |  
通过电脑发布 #6楼 评论时间:2007-6-4 21:55 (Monday)
johnnychen

我个人对Hibernate 和 Spring 都非常有好感,首先Hibernate 为我们减轻查询语句开发,因为有HQL,而且它对数据库可移植,是不错的东西,只是配置文件有复杂,越往高级的框架就越用到配置文件,解耦合吧,另外Spring 也不错呀,虽然代码两复杂但可以做到松耦合,它通过AOP的切面再用IOC的依赖注入实现低耦合,这样可以帮整个程序变得较送,重用性又强,不错呀^^^^^^^^

 
姓名: 
邮箱:  {可选}
网址:  {可选} 此评论只有我和写日记的人查阅
校验码: ... <我看不清楚>
网记为您提供手机和互联网同步的个人主页,带给你不一样的体验