`
江南白衣
  • 浏览: 549969 次
  • 来自: 广州
社区版块
存档分类
最新评论

Hibernate3.0 vs Rails Active Record

阅读更多

    前篇:最美的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>的合著者写的。



分享到:
评论

相关推荐

    Pro Active Record. Databases with Ruby and Rails

    ### Pro Active Record: Databases with Ruby and Rails #### 书籍概览 《Pro Active Record: Databases with Ruby and Rails》是一本由Kevin Marshall、Chad Pytel和Jon Yurek共同编写的关于Ruby on Rails(简称...

    Rails 3中的Active Record的查询变化.doc

    在Rails 3中,Active Record查询接口发生了显著的变化,这些变化主要是为了提高代码的可读性和性能,引入了懒加载(Lazy Loading)的概念。本文将详细介绍这些查询方式的转变及其背后的动机。 首先,我们注意到旧版...

    active_record_upsert, Rails 5/Active Record 5的更新更新.zip

    active_record_upsert, Rails 5/Active Record 5的更新更新 ActiveRecordUpsertpostgre 9.5 和 Rails 5/ActiveRecord 5的真正更新。 在冲突时使用进行更新。的主要点是否在单个记录上使用 ON CONFLICT DO U

    greenin:在 Rails Active Record 模型中描述你的葡萄实体

    在 Rails Active Record 模型中描述你的葡萄实体 安装 将此行添加到应用程序的 Gemfile 中: gem 'greenin' 或者 gem 'greenin' , github : 'itbeaver/greenin' 然后执行: $ bundle 或者自己安装: $ gem...

    Pro.Active.Record.Databases.with.Ruby.and.Rails

    ### Pro Active Record Databases with Ruby and Rails #### 概述 《Pro Active Record Databases with Ruby and Rails》一书由Kevin Marshall、Chad Pytel和Jon Yurek共同撰写,旨在帮助开发者掌握如何使用Ruby及...

    Ruby on Rails Guides_ A Guide to Active Record Associations.pdf

    Ruby on Rails Guides_ A Guide to Active Record Associations.pdf

    Rails进行敏捷Web开发(所有版本的源码rails3.0-4.0)

    在“Rails进行敏捷Web开发(所有版本的源码rails3.0-4.0)”中,包含了Rails从3.0到4.0各个主要版本的源代码,这些版本的变迁反映了Rails框架在不同阶段的发展和改进。 1. Rails 3.0: Rails 3是重大升级,引入了...

    种使用MVC架构开发的Trello,使用Active Record进行数据库查询.zip

    Active Record是Ruby on Rails框架中的一个核心组件,它将数据库操作封装在对象中,使得数据库访问变得简单而直观。在MVC架构中,Active Record作为模型层的一部分,负责与数据库进行交互。 1. **数据库映射**: ...

    activerecord-analyze:将EXPLAIN ANALYZE添加到Rails Active Record查询对象

    该gem为Active Record查询对象添加了一个analyze方法。 它对查询SQL执行EXPLAIN ANALYZE 。 您可以查看此博客文章,以获取有关如何更多信息。 支持以下format选项:json, :hash, :yaml, :text, :xml 。 :json格式...

    activerecord-session_store:从Rails中提取的Active Record的会话存储

    rails generate active_record:session_migration 运行迁移: rake db:migrate 然后,在config/initializers/session_store.rb设置会话存储: Rails . application . config . session_store :active_record_...

    Active Record所引用的程序集

    Active Record是Ruby on Rails框架中的一个核心组件,它实现了对象关系映射(ORM)系统,使得开发者能够以面向对象的方式处理数据库操作。在.NET环境中,虽然没有原生的Active Record库,但存在类似的概念和库,如...

    Rails相关电子书汇总二

    标题中的“Rails相关电子书汇总二”表明这是一个关于Ruby on Rails框架的电子书籍集合,特别是与Active Record数据库交互相关的主题。Rails是Ruby编程语言的一个流行Web应用框架,它以其MVC(模型-视图-控制器)架构...

    Ruby on Rails Guides v2 - Ruby on Rails 4.2.5

    通过以上介绍,我们不仅了解了Rails的基础知识,还深入探讨了其核心组件——Active Record的相关概念和技术细节。这些内容对于初学者来说是非常宝贵的入门资料,同时也是进一步学习和实践的基石。随着对Rails的深入...

    active_record_upsert:Rails的Upsert 5 Active Record 5

    ActiveRecordUpsert PostgreSQL 9.5+和Rails 5+ / ActiveRecord 5+的真实更新。 使用 。 要点 使用ON CONFLICT DO UPDATE在单个记录... gem 'active_record_upsert' 然后执行: $ bundle 或将其自己安装为: $ gem

    SwiftCop:SwiftCop是一个完全用Swift编写的验证库,其灵感来自Ruby On Rails Active Record验证的清晰性

    SwiftCop是一个完全用Swift编写的验证库,其灵感来自的清晰性。 目的 为Swift中的验证建立标准的嵌入式库,同时使用户可以轻松扩展以创建自定义验证。 并避免开发人员为不同项目一遍又一遍地编写相同的代码和验证。...

    好用的rails 2.0 Api 文档

    在Rails 2.0中,Active Record是ORM(对象关系映射)的一部分,它使得Ruby类可以直接与数据库表进行交互。每个Active Record类都代表一个数据库表,类的实例对应表中的行,类的属性对应列。Active Record提供了许多...

    rails向导打包

    1. **Active Record 查询接口**: Active Record 是 Rails 的核心组件之一,它负责模型和数据库之间的交互。这个文件详细介绍了如何在 Rails 中使用查询语言来检索、过滤和操作数据。这包括基本的查找方法(如 `find`...

    rails4.0.0

    Rails 4.0.0中的Active Record进行了优化,提升了查询性能。引入了`find_by`和`find_or_create_by`等简洁的方法,使得数据库操作更加方便。同时,`update_all`和`destroy_all`方法现在可以直接接收SQL片段,提供了...

Global site tag (gtag.js) - Google Analytics