首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

精通 Grails:整合遺留資料庫——靈活映射非標準命名慣例

     編輯:Java 相關知識

GORM(Grails Object Relational Mapping)是 Grails 核心之一。前文已介紹基本關聯建模,本文將探討如何讓 GORM 靈活應對遺留資料庫中不符合 Grails 命名慣例的資料表與欄位名稱。

資料備份與還原:安全第一

操作既有資料前務必備份。除常規備份軟體,建議保留純文字格式(如 XML)備份,利於跨資料庫遷移(MySQL ↔ DB2)與建立測試環境。提供 Groovy 腳本 backupAirports.groovy:以 groovy.sql.Sql 連線 JDBC,MarkupBuilder 產生 XML,依主鍵順序匯出確保外鍵一致性。還原腳本 restoreAirports.groovy 使用 XmlParser 讀取 XML 並執行 INSERT。腳本獨立於 Grails,需安裝 Groovy 並置入 JDBC 驅動 JAR(建議放入 ~/.groovy/lib 自動載入)。

匯入 USGS 機場資料建立遺留資料表

美國地質調查局(USGS)提供機場 Shapefile,經 GDAL 轉換為 GML(Geography Markup Language)XML。建立 usgs_airports 資料表(欄位:airport_id、locid、feature、airport_name、state、county、latitude、longitude),並撰寫 restoreUsgsAirports.groovy 解析帶命名空間的 GML XML(使用 groovy.xml.Namespace),將 901 筆資料匯入。驗證資料表結構與筆數無誤後,務必在 DataSource.groovy 設定 dbCreate = "" 關閉 GORM 自動建表/修改,保護遺留結構。

策略一:靜態 mapping 區塊映射

最貼近 Grails 風格。複製 Airport.groovy 為 AirportMapping.groovy,註解缺失欄位(city、country),在 static mapping 區塊指定:

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"
    }
}

version false 關閉樂觀鎖版本欄位;columns 區塊對應欄位名稱。忽略的資料表欄位(feature、county)無需在領域類別定義。若領域類別有不存資料庫的暫態欄位,可用 static transients = ['tempField1','tempField2']。執行 grails generate-all AirportMapping 產生控制器與視圖,移除寫入動作與按鈕使其唯讀,驗證列表與顯示正常。

策略二:遺留 Java 類別 + Hibernate 映射檔(HBM)

若已有遺留 Java 類別(如 org.davisworld.trip.AirportHbm),置於 src/java 對應套件目錄。同目錄建立 AirportHbmConstraints.groovy 放置 constraints。控制器 import Java 類別並設定 def scaffold = AirportHbm。在 grails-app/conf/hibernate/hibernate.cfg.xml 註冊 <mapping resource="AirportHbm.hbm.xml"/>。HBM XML 完整定義類別對應資料表、主鍵產生策略、欄位映射(含 not-null 等約束)。重啟 Grails 即可運作。

策略三:遺留 Java 類別 + EJB3 註解

Java 1.5 導入註解,Groovy 1.5 起支援。建立 AirportAnnotation.java 加上 @Entity、@Table(name="usgs_airports")、@Id、@Column 等註解。同樣需 AirportAnnotationConstraints.groovy、控制器與 hibernate.cfg.xml 註冊 <mapping class="org.davisworld.trip.AirportAnnotation"/>。關鍵步驟:在 DataSource.groovy 匯入 GrailsAnnotationConfiguration 並設定 dataSource.configClass = GrailsAnnotationConfiguration.class,啟用註解掃描。遺漏此步驟會拋出 MappingException。

結語

GORM 提供多樣映射策略:靜態 mapping 區塊最簡單且 Grails 風格濃厚;HBM XML與EJB3 註解可直接復用既有 Java 資產。擁有完善備份還原流程後,即可放心讓 Grails 與遺留資料庫無縫整合。下一篇將探討 Grails 事件模型:從建構腳本到各工件生命週期事件,學習設置監聽器回應自訂操作。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved