花钱的年华

--今天开始成为主站

用户操作
[即时聊天] [发私信] [加为好友]
江南白衣ID:calvinxiu
691445次访问,排名53好友0人,关注者38
calvinxiu的文章
原创 161 篇
翻译 0 篇
转载 0 篇
评论 646 篇
江南白衣的公告

肖桦,江南白衣,
开源项目SpringSide
春天的旁边
发起者

最近评论
calvinxiu:
发版本最痛苦的事情,就是刚发完之后忽然又有了一个比较重要的更新。

推荐大家下载3.0.3.1 (2mb)

1.简化了目录结构,感觉又清爽了不少。
2.消除了最后一块需要逐个Class写配置文件的地方(applicationContext.xml中的sessionFactory的mapping class)。
dreaming:恭喜~
hongyi:还是一头雾水,郁闷,为啥有这么多东东,叫人头大
suncheng_hong:用过appfuse,但springside还没有尝试过。
suncheng_hong:很想尝试一下。
文章分类
    收藏
      相册
      Blog用图
      Friends
      @_@
      Anders小明
      buaawhl
      cac
      canonical
      cctvx1
      david.turing
      femto
      g9
      JohnsonQu
      Michael Chen
      Raimundox
      robbin
      SimonLei
      totodo
      wuyu
      周爱民
      孟岩
      差沙
      庄表伟
      落魄的程序员
      透明
      郁也风
      铁手
      银狐999
      飞云小侠
      存档
      订阅我的博客
      XML聚合  FeedSky
      订阅到鲜果
      订阅到Google
      订阅到抓虾
      订阅到BlogLines
      订阅到Yahoo
      订阅到GouGou
      订阅到飞鸽
      订阅到Rojo
      订阅到newsgator
      订阅到netvibes

      原创 Hibernate3.0 vs Rails Active Record收藏

      新一篇: 以一个最简单的例子把OO的JavaScript说明白 | 旧一篇: 最轻省的MVC,ORM方案原来在别处--Ruby on Rails 2nd

          前篇:最美的MVC,ORM方案原来在别处--Ruby on Rails    

          Rails的出现,良性的冲击了自己目前使用的Spring+Hibernate架构。有冲击是好的,否则EJB2和Struts现在还一统江湖。
          本文主要记述了Hibernate3.0(H3)和Rails Active Record(AR)在定义和使用Domain Objectt方面的优劣,更重要是冲击过后,计划如何重构改善自己的框架。

      POJO定义
      1.AR定义POJO的只需这样寥寥几笔

      class Company < ActiveRecord::Base
         has_many   :clients
         belongs_to :boss
      end
      其中"公司名"之类的属性,已经被Automate Mapping了,而has_many、belongs_to语句清晰的声明了与clients、boss的关联关系。

      2.对比Hibernate2.0时代
      程序员必须同时维护POJO与hbm两个文件事无大小逐一重复声明,而且如果使用XDoclet,更加冗长得要命。此时,Active Record的定义方式简直是生产力大解放,两家的代码行数上有几十倍的差别。

      3.幸亏,Hibernate3.0已经支持Annotation声明。
      终于可以丢弃hbm文件了,同时h3也会拥有表名和列名auto mapping的智能,就像这样:

      @Entity
      public class Company implements Serializable
      {
          @Id
          public Long getCompanyNo() { return companyNo; }

         
      public String getName() {return name;}

         
      @ManyToOne
          @JoinColumn(name = “boss_id”)

         
      public Boss getBoss() {return regionalCenter;}

         
      @Transient
          String getLengthInMeter()
      }


      其中公司名被automate mapping了, @ManyToOne定义了关系,@Transient定义了该属性不需要被持久化。

      4.最后觉得
      对比起来,似乎Hibernate3.0 的方式更好,毕竟AR把东西都列名都auto-map得没影了,要自己打开数据库的Schema来看。而且H3可以比AR定义复杂的关系和情况。不过H3的Annotation只出到Beta1,还要赶紧努力。


      Domain Model使用
      首先两者都属于Martin Fowler说的Domain Model范畴,不过AR当然就是Active Record模式,而Hibernate属于Data Mapper

      Active Record因为totally只有一个POJO对象,所以几乎强迫性的使用了DDD的模式。
      而Data Mapper模式据Martin说为了彻底解耦数据库结构和领域对象,增加了一个EntityManager类( JDO 叫PersistenceManager, Hibernate 叫 Session. TopLink 叫 UnitOfWork),这便引发了关于DDD(Domain Driven Develope)和贫血的POJO,事务脚本式的Service层等无穷争论。

      Active Record的特点:代表着数据库中的一行数据,拥有领域对象的领域属性,领域方法和持久性方法,finder方法被定义为类的静态方法。同时因为Cat继承于ActiveRecord,因此默认具有new,save,find,find_all等方法。

      cat = Cat.find(pkId)
      cat.catch(mouse)
      cat.save

      对于极端OO分子及小白编程主义者来说,上面的代码真是棒极了。

      而Hibernate里面,因为有session,有Manager类,还有Service层,甚至还有一个DAO层的存在,组合便变得迷离起来。

      争论的起因很简单,因为领域方法在极端理想的情况下才会只操作自己的属性,比如countTax(),而很多情况下都需要动态的执行find()方法从数据库里再拉些对象参与事务,有很多时候拉的还是别人的对象。因此,怎么组合Service,Manager,DAO变是DDD争论的开始。

      关于DDD的口水已经太多了,自己实际中也还是高级DAO的水平。这里随便一说:


      1.有些极端清廉的做法:
       
      每个Manager只负责与自己的POJO相关的动作,把综合的事务都交给Service层,这就是让Martin大发牢骚的复杂service模式。 
          其实这是把Manager类重新退化为表入口的模式。既然我们提倡OO,就应该勇敢的进行关联,从来没见过不关联别人的事物。怕的话最多把依赖对象抽象成一个interface。依赖一个很公共的interface比依赖某个具体实现类强。

      2.另一个最普遍的清廉做法
       POJO就only拥有自己的领域属性,和领域方法,而没有DAO的句柄。这种模式,即使是很多示范性的著名例子都是这样的。其实如前所述,这显然一厢情愿的认为领域方法就是倒腾领域对象自己的那几个属性和相关对象,POJO持有DAO的指针是需要的。
          所以POJO应该利用Spring,利用IOC,很优雅的在必要时持有DAO和他的session,很希望有著名例子能够提供这样的示范。

      3.在Rod的<withdout EJB>里,是这样子折中的:

      public class OrderManager 
      {
       private OrderDao orderDao;
       public void placeOrder(Order order)
       {
        orderDao.storeOrder(order);
        orderDao.updateInventory(order);
       }
      }(摘自<withdout EJB>例子)
       大家看到了什么?
      1.商业方法和持久化方法没有严格区分,都混在orderDAO里,商业操作里可以带有持久化方法.
      2.OrderDAO有执行对Order以外的对象(库存对象)的操作.
      3.商业对象是Manager对象,而不是POJO对象--order对象,所谓POJO应该依旧贫血,戏份不大.(让POJO持有DAO句柄在Spring里不太容易)

      可以看出Rod非常非常非常的实际.
      Rod说,当有别的持久化方案袭来,或者自己想要把代码弄清晰点的时候,才需要把Data Acess Object和Business Object分开.

      改进计划

      1.首先是尝试使用Hibernate3.0 Annotation Beta1,去掉hbm文件,并使用她的automapping功能简化配置

      2.使用反射,加强Manager类的父类,拥有一批默认的方法。
          虽然有MDA可以自动在子类生成这些方法,但我认为生成以后还是有维护与代码量的成本,所以即使是Code Generation,也应该先使用重用技术把代码减到最少再进行代码生成,不能因为有了Code Generation就不注意代码的抽象重用。

      3.研究如何在Spring体系下让POJO优雅的持有DAO句柄,实现真正的DDD编程。
       当然也可以不干这个,继续Rod的实际模式.

      4.参照Rails , 研究如何在父类增加validates_uniqueness_of   :subdomain这样的函数。

      5.参照Rails , 研究Hibernate3下面对Event的管理和Observer模式的应用。

      最后, TSS上有个Hibernate vs Rails的文章,是由<Hibernate Quickly>的合著者写的。

      发表于 @ 2005年04月25日 00:22:00|评论(loading...)|编辑

      新一篇: 以一个最简单的例子把OO的JavaScript说明白 | 旧一篇: 最轻省的MVC,ORM方案原来在别处--Ruby on Rails 2nd

      评论

      #calvin 发表于2005-04-26 15:06:00  IP: 218.19.152.*
      文章的主体是如何学习AR的优点, 改进自己的Spring+Hibernate体系,而不是动员大家用AR:)
      #corer 发表于2005-04-26 13:24:00  IP: 219.239.5.*
      Rails Active Record 这东西只能说说而已 也没有市场 大家不要盲目跟风 在国内常用的c/c++,java啊
      #stop ruby 发表于2005-04-27 08:17:00  IP: 218.94.127.*
      盲目跟风,没有一个有好下场的,核心的东西在别人手里,我们永远跟在后面,你累不累??
      #Tsang 发表于2005-04-27 09:16:00  IP: 164.71.1.*
      優點要看到,思想要領悟,就是對的。什麽叫跟風?
      放眼看看國内的IT,那叫一盤散沙。
      日本大大小小的軟件公司,凡是做JAVA的,很多都擁有自己開發的Framework,當初EJB出來的時候,接近200傢公司組成EJB研究協會,我們國人,總是在個人與個人之間批判,從來沒有想過大家聯合起來做點什麽。
      #Tsang 发表于2005-04-27 09:17:00  IP: 164.71.1.*
      優點要看到,思想要領悟,就是對的。什麽叫跟風?
      放眼看看國内的IT,那叫一盤散沙。
      日本大大小小的軟件公司,凡是做JAVA的,很多都擁有自己開發的Framework,當初EJB出來的時候,接近200傢公司組成EJB研究協會,我們國人,總是在個人與個人之間批判,從來沒有想過大家聯合起來做點什麽。
      #自强 发表于2005-04-27 09:51:00  IP: 210.76.124.*
      自己设计框架,自己写满足需求的模式,为什么一定要用别人的???
      #calvin 发表于2005-04-27 17:05:00  IP: 219.136.129.*
      re supermy:
      Groovy迟迟没有正式版,基于他的方案还没什么阿,大家都只拿它做做脚本什么的,完整的做个Project,Component出来还不见有,你能给出URL么?
      #supermy 发表于2005-04-27 13:27:00  IP: 221.216.138.*
      groovy

      groovy+spring 也许会更好
      #neoedmund 发表于2005-04-27 15:32:00  IP: 61.155.111.*
      Annotation太新了,除非自己开公司的放荡不羁的程序员才会在现在用它吧。。。
      #wangchq 发表于2005-04-29 09:49:00  IP: 211.160.160.*
      技术领域没有什么根风不根风的说法,新的事务我们要用于尝试,去实践.如果真的可以带来好处,就可以使用.什么叫核心在别人手里?难道前人的经验全部要抛弃?主要还是要看是不是适合实际使用,是不是可以带来好处.
      #Steven 发表于2005-09-20 16:53:00  IP: 211.100.21.*
      Groovy... 可以看看 NanoContainer 呢 http://www.nanocontainer.org/
      发表评论  


      登录
      Csdn Blog version 3.1a
      Copyright © 江南白衣