技术开发 频道

精通Grails: Grails与遗留数据库

  静态映射块

  我将示范的第一个将域类映射到遗留表的策略是使用静态 mapping 块。大多数情况下我都会使用这个块,因为它感觉最像 Grails。我习惯将静态 constraints 块添加到域类,这样添加静态 mapping 块感觉起来和添加框架的其余部分是一致的。

  将 grails-app/domain/Airport.groovy 文件复制到 grails-app/domain/AirportMapping.groovy。这个名称只是为了示范用的。因为将会有三个类全部映射回相同的表中,因此需要有一种方式来将每一个类单独命名(这在真实的应用程序中不大可能会发生)。

  注释掉城市与国家字段,因为在新的表中没有这些字段。然后从 constraints 块中移除这些字段。现在添加 mapping 块,将 Grails 的名称链接到数据库名,如清单 8 所示:

  清单 8. AirportMapping.groovy

class AirportMapping{
  static constraints
= {
    name()
    iata(maxSize:
3)
    state(maxSize:
2)
    lat()
    lng()
  }
  
  static mapping
= {
    table
"usgs_airports"
    version
false
    columns {
      id column:
"airport_id"
      name column:
"airport_name"
      iata column:
"locid"
      state column:
"state"
      lat column:
"latitude"
      lng column:
"longitude"              
    }
  }
  
  
String name
  
String iata
  
//String city
  
String state
  
//String country = "US"
  
String lat
  
String lng
  
  
String toString(){
    
"${iata} - ${name}"
  }
}

  mapping 块的第一条语句将 AirportMapping 类链接到 usgs_airports 表。下一条语句通知 Grails 表没有 version 列(GORM 通常会创建一个 version 列来优化乐观锁定)。最后,columns 块将 Grails 名称映射到数据库名称。

  注意,使用了这个映射技术,表中的某些特定的字段是可以忽略的。在这种情况下,feature 与 county 列未表示在域类中。要想让未储存于表中的字段存在于域类中,可以添加静态 transients 行。该行看起来与一对多关系中使用的 belongsTo 变量类似。例如,如果 Airport 类中有两个字段不需要储存到表中,代码会是这样的:

static transients = ["tempField1", "tempField2"]

  此处示范的 mapping 块仅仅涉及到此技术可以实现的皮毛而已。想了解更多的信息,参见 参考资料。

  设置遗留表为只读

  输入 grails generate-all AirportMapping,创建 控制器和 GSP 视图。由于此表实质上是一个查找表,所以请进入 grails-app/controllers/AirportMappingController.groovy,只留下 list 和 show 闭包。移除 delete、edit、update、create 以及 save(不要忘记从 allowedMethods 变量中移除 delete、edit 和 save。可以完全移除整个行,或者只留下方括号空集)。

  要使该视图为只读,还需要做几个快捷的更改。首先,从 grails-app/views/airportMapping/list.gsp 顶端移除 New AirportMapping 链接。然后对 grails-app/views/airportMapping/show.gsp 做相同操作。最后,从 show.gsp 底部移除 edit 和 delete 按钮。

  输入 grails run-app,验证 mapping 块可以运行。请看一下图 1 中展示的页面:

  图 1. 验证 mapping 块可以运行  

0
相关文章