快速业务通道

Java开发2.0: NoSQL - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15
需如清单 8 所示扩展 Model :

清单 8. 创建一个参赛者很简单

package com.b50.nosql   class Runner extends Model{   public Runner(params){   super(params)   }   }

看看 清单 8,我感觉自己几乎完成工作了。但是,我还需创建参赛者和比赛 之间的链接。当然,我将把它建模为一个 “多对多” 关系,因为我希望我的参 赛者可以参加多项比赛。

没有架构的域建模

Google App Engine 在 Bigtable 上面的抽象不是一个面向对象的抽象;即, 我不能原样存储关系,但可以共享键。因此,为建模多个 Race和多个 Runner之 间的关系,我将在每个 Race实例中存储一列 Runner键,并在每个 Runner实例中 存储一列 Race键。

我必须对我的键共享机制添加一点逻辑,但是,因为我希望生成的 API 比较 自然 —我不想询问一个 Race以获取一列 Runner键,因此我想要一列 Runner。 幸运的是,这并不难实现。

在清单 9 中,我已经添加了两个方法到 Race实例。但一个 Runner实例被传 递到 addRunner方法时,它的对应 id被添加到底层 entity的 runners属性中驻 留的 id的 Collection。如果有一个现成的 runners的 collection,则新的 Runner实例键将添加到它;否则,将创建一个新的 Collection,且这个 Runner 的键(实体上的 id属性)将添加到它。

清单 9. 添加并检索参赛者

def addRunner(runner){   if(this.@entity.runners){   this.@entity.runners << runner.id   }else{   this.@entity.runners = [runner.id]   }   }   def getRunners(){   return this.@entity.runners.collect {   new Runner( this.getEntity(Runner.class.simpleName, it) )   }   }

当清单 9 中的 getRunners方法调用时,一个 Runner实例集合将从底层的 id 集合创建。这样,一个新方法(getEntity)将在 Model类中创建,如清单 10 所 示:

清单 10. 从一个 id 创建一个实体

def getEntity(entityType, id){   def key = KeyFactory.createKey(entityType, id)   return this.@datastore.get(key)   }

getEntity方法使用 Google 的 KeyFactory类来创建底层键,它可以用于查找 数据存储中的一个单独实体。

Java开发2.0: NoSQL(7)

时间:2011-09-04 IBM Andrew Glover

最后,定义一个新的构造函数来接受一个实体类型,如清单 11 所示:

清单 11. 一个新添加的构造函数

public Model(Entity entity){   this.@entity = entity   }

如清单 9、10和 11、以及 图 1的对象模型所示,我可以将一个 Runner添加 到任一 Race,也可以从任一 Race获取一列 Runner实例。在清单 12 中,我在这 个等式的 Runner方上创建了一个类似的联系。清单 12 展示了 Runner类的新方 法。

清单 12. 参赛者及其比赛

def addRace(race){   if(this.@entity.races){   this.@entity.races << race.id   }else{   this.@entity.races = [race.id]   }   }   def getRaces(){   return this.@entity.races.collect {   new Race( this.getEntity(Race.class.simpleName, it) )   }   }

这样,我就使用一个无模式数据存储创建了两个域对象。

通过一些参赛者完成这个比赛

此前我所做的是创建一个 Runner实例并将其添加到一个 Race。如果我希望这 个关系是双向的,如 图 1中我的对象模型所示,那么我也可以添加一些 Race实 例到一些 Runner,如清单 13 所示:

清单 13. 参加多个比赛的多个参赛者

def runner = new Runner([fname:"Chris", lname:"Smith",  date:34])   runner.save()   race.addRunner(runner)   race.save()   runner.addRace(rac

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号