精通Grails: GORM - 有趣的名称,严肃的技术 - 编程入门网
象组合(object composition)(请参阅 参考资料)。
清单 3.在 Trip 类中添加 Airline 属性
对于软件模型来说,这种表示方法非常合适,但是关系数据库采取的表示方法略有不同。表中的每个 记录都有一个惟一的 ID,称为主键。向 Trip 表添加一个 airline_id 字段,就能将一个记录与另一个 记录链接在一起(在这个示例中,“Xyz航线” 记录与 “芝加哥旅行” 记录链接)。这称为一对多 关 系:一个航线能够与多个旅行关联。(在 Grails 的联机文档中,可以找到一对一和多对多关系的示例, 请参阅 参考资料。) 这样形成的数据库模式只有一个问题。您可能对数据库成功地进行了规范化(请参阅 参考资料),但 是现在表中的列与软件模型就失去了同步。如果将 Airline 字段替换成 AirlineId 字段,那么实现的细 节(在数据库中持久化 POGO)就泄漏 到了对象模型。Joel Spolsky 将这种情况称为 抽象泄漏法则 (Law of Leaky Abstractions)(请参阅 参考资料)。 GORM 有助于缓解抽象泄漏问题,它支持使用对 Groovy 有意义的方式表示对象模型,由 GORM 在幕后 处理关系数据库的问题。但是正如即将看到的,如果需要,覆盖默认设置也很容易。GORM 并不是隐藏数 据库细节的不透明的 抽象层,而是一个半透明的 层 — 它尝试在不进行用户干预的情况下执行正确的工 作,但是如果用户需要对它的行为进行自定义,它也可以提供支持。这样它就提供了两方面的好处。 现在已经在 POGO 类 Trip 中添加了 Airline 属性。要完成一对多关系,还要在 Trip 这个 POGO 中 添加一个 hasMany 设置,如清单 4 所示: 清单 4. 在 Airline 中建立一对多关系
静态的 hasMany 设置是个 Groovy 的 hashmap:键是 trip;值是 Trip 类。如果要在 Airline 类中 设置额外的一对多关系,那么可以将逗号分隔的键/值对放在方括号内。 现在在 grails-app/controllers 中迅速创建一个 AirlineController 类(如清单 5 所示),这样 就能看出新的一对多关系的效果: 清单 5. AirlineController class
还记得在上一期的文章中说过 def scaffold 的功能是告诉 Grails 在运行的时候动态创建基本的 list()、save() 和 edit() 方法。它还告诉 Grails 动态创建 GroovyServer Page(GSP)视图。请确保 TripController 和 AirlineController 都包含 def scaffold。如果曾经因为输入 grails generate- all 在 grails-app/views 中生成过任何 GSP 工件,例如 trip 目录或者是 airline 目录,都应该删除 它们。对于这个示例,需要确保既允许 Grails 动态搭建控制器,又允许它动态搭建视图。 现在域类和控制器类都已经就位,请启动 Grails。请输入 grails prod run-app 在生产模式下运行 应用程序。如果一切正常,应该看到欢迎消息:
精通Grails: GORM - 有趣的名称,严肃的技术(3)时间:2011-07-25 IBM Scott Davis在浏览器中,应该看到 AirlineController 和 TripController 链接。单击 AirlineController 链 接,填写 Xyz 航线的详细信息,如图 1 所示: 图 1. 一对多关系:一方 如果不喜欢字段按照字母顺序排序,也不用担心。在下一节就能改变这种方式。 现在新建一个旅程,如图 2 所示。请注意 Airline 的组合框。添加到 Airline 表的每个记录都在这 里显示。不用担心 “泄漏” 主键 — 在下一 |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |