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