技术开发 频道

Hibernate vs. Rails:数据持久化


关系

    在最后的部分,我们看到的Miner类是一个映射到一个单表miners的类。除此之外,ORM还支持将表之间的关系映射成内存对象,但是Hibernate和Rails在处理关系映射时是不同的。它们两都可以处理大多数的映射关系。下面列出了它们所支持的映射关系。
    1、 多对一 - belongs_to
    2、 一对一 - has_one
    3、 一对多(set) - has_many
    4、 多对多(set) - has_and_belongs_to_may
    5、 单表继承
    6、 组合(每个表对应一个以上的对象)

    下面让我们看一个关于“多对一”关系的例子。我们将要扩展Deadwood例子的第一部分。我们加入一个GoldClaim对象,以使这个对象和Miner形成多对一的关系。这就意味着miners表有一个外键:gold_claim_id。这个外键表示gold_claims表的一行。
    (Java)
public class Miner { // Other fields/methods omitted private GoldClaim goldClaim; /** * @hibernate.many-to-one column="gold_claim_id" * cascade="save" */ public GoldClaim getGoldClaim() { return goldClaim; } public void setGoldClaim(GoldClaim goldClaim) { this.goldClaim = goldClaim; } } (Rails) class Miner < ActiveRecord::Base belongs_to :gold_claim end
    以上代码在功能上并没有什么不同,它们做了同样的事情。只是Hibernate显式地映射了外键,以及相应的动作(这个将在下面介绍)。保存Miner将同时保存和它相关的GoldClaim。但是更新和删除Miner将不会影响到GoldClaim对象。

传播性持久化

     Non-demo应用程序倾向于和深层次的对象集一起工作。ORM提供一种可以探测内存对象和数据库变化的方法是非常重要的。Hibernate所提供的方法是级联持久化。Rails在这一方面的功能好像比较有限,它是基于关系类型的。例如,Rails默认情况下好像是通过belongs_to来模仿Hibernate的cascade=”save”行为。
miner = Miner.new("name" => "Brom Garrott") miner.gold_claim = GoldClaim.new( "name" => "Western Slope") miner.save # This saves both the Miner and GoldClaim objects miner.destroy # Deletes only the miner row from the database
    Hibernate的删除操作为所有的关系类型提供了很多不同的级联行为(cascading behaviors),以使它拥有更大的弹性。例如,设置 cascade=”all” 将使GoldClaim在保存,更新和删除的同时也操作Miner。

Miner miner = new Miner(); miner.setGoldClaim(new GoldClaim()); session.save(miner); // Saves Miner and GoldClaim objects. session.delete(miner); // Deletes both of them.
   为了公平,你也可以使用Rails做同样的事情,但你必须通过回调(callback)来定制Miner对象的行为。在Rails中,级联操作只能在”has_one”中使用。以下的代码并不能变化GoldClaim的name属性。

miner = Miner.find(@params['id']) miner.gold_claim.name = "Eastern Slope" miner.save
    如果要想更新name,可按如下代码所示

class GoldClaim < ActiveRecord::Base has_one :miner end claim = GoldClaim.find(@params['id']) claim.miner.name = "Seth Bullock" claim.save # Saves the miner's name
   使用 cascade = “save-update:”,你可以在任何映射关系中使用这个行为,而不管外键是否基于传播性持久化的关系类型。还是级联类型,这将使Hibernate变得更强有力。接下来,让我们看看每一个框架如何查找已经持久化了的对象。
0
相关文章