GRAILS 對象關係映射(GORM)

域類是任何業務應用的核心。他們保持有關的業務流程狀態和實現行爲。他們是通過關係連在一起的,一對一,一對多,多對多。

GORM是Grails對象關係映射(ORM)的實現。在底層,它使用Hibernate3(一個非常受歡迎的和靈活的開源ORM解決方案),感謝GORM的靜態和動態類型的Groovy特性,加上Grails的約定,創建Grails領域類的配置也遠遠低於其他框架。

您也可以在Java中編寫Grails域類。請參閱Hibernate的集成,在Java中寫域類,仍然要使用動態持久方法。下面是GORM在action中的一個預覽:

def book =Book.findByTitle("Groovyin Action")

book

  .addToAuthors(name:"Dierk Koenig")

  .addToAuthors(name:"Guillaume LaForge")

  .save()

快速入門指南

通過create-domain-class命令可以創建域類:

grailscreate-domain-class helloworld.Person

!!!如果未指定程序包創建域類腳本,Grails自動使用該應用程序的名稱作爲包名。

這將在grails-app/domain/helloworld/Person.groovy位置創建一個類:

package helloworld

class Person {

}

如果你在數據源配置中將dbCreate屬性設置爲“update”,“create”或“create-drop”,Grails將自動生成或修改你的數據庫表。

您可以在生成的類中添加自定義的屬性:

class Person {

    String name

    Integer age

    Date lastVisit

}

一旦你有一個域類,可以嘗試用shell或console上輸入:

grails console

加載一個交互式的圖形用戶界面,在這裏你可以運行Groovy命令訪問到Spring的ApplicationContext,GORM等。

基本的CRUD

嘗試執行一些基本的CRUD(創建/讀取/更新/刪除)操作。

創建

要創建一個域類對象,使用Map的構造函數設置其屬性值並保存:

def p = new Person(name:"Fred", age: 40, lastVisit:new Date())

p.save()

save方法將堅持你的類使用底層的HibernateORM層到數據庫。

閱讀

Grails增加了一個隱含的id屬性,您可以使用您的域類檢索:

def p =Person.get(1)

assert 1 == p.id

使用GET方法,從數據庫中讀取Person對象返回一個數據庫標識符。您也可以使用的read方法載入只讀狀態中的對象:

def p =Person.read(1)

在這種情況下,底層的Hibernate引擎對不會做任何髒檢查的對象不會保留。請注意,如果你明確地調用保存方法,需要將對象放置到讀寫狀態。

此外,您還可以通過使用負載方法加載一個代理實例:

def p =Person.load(1)

這不會招致該數據庫訪問的方法之前其他的getId()被調用。它會初始化Hibernate的代理實例,如果沒有找到記錄指定的ID,拋出一個異常,。

更新

要更新的一個實例,改變一些屬性,然後再次調用save:

def p =Person.get(1)

p.name = "Bob"

p.save()

刪除

使用delete方法刪除實例:

def p =Person.get(1)

p.delete()

 GORM中域建模

創建Grails應用程序時,你必須要考慮你正在試圖解決的問題域。例如,如果你正在建立一個亞馬遜風格的書店,你會思考書籍,作者,客戶和出版商,僅舉幾例。

這些仿照GORM中的Groovy類,書類可能有一個標題,發佈日期,ISBN號等。接下來的幾節顯示在GORM中如何模擬域。

要創建一個域類,運行時create-domain-class命令如下:

grailscreate-domain-class org.bookstore.Book

其結果將是創建一個類的基礎grails-app/domain/org/bookstore/Book.groovy:

package org.bookstore

class Book {

}

這個類會自動映射到數據庫中的一個表被稱爲book(類相同的名稱)。此行爲是通過ORM的領域特定語言定製

現在,你有一個域類,你可以定義其屬性的Java類型。例如:

package org.bookstore

class Book {

    String title

    Date releaseDate

    String ISBN

}

每個屬性映射到數據庫中的一列,其中列名的慣例是全部小寫,用下劃線分隔。例如的RELEASEDATE映射到一列RELEASE_DATE。 SQL類型自動檢測從Java類型,但可以定製約束或ORM DSL。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章