GORM就是以前我剛學Groovy沒多久時想實現的功能
它使開發人員不需要關心數據庫方面
也不需要任何配置
只需專心用OO思想設計自己的系統
還有一個好處就是開發時不用備份數據庫
因為GORM會自動幫你建表以及約束(但數據庫需要你自己建)
讓我們來看一下用Grails開發是多麼簡單高效吧!
在Grails+中配置稍有不同詳見 朝花夕拾——Groovy & Grails
在寫域類時無須添加與業務無關的屬性比如在用Hibernate時我們需要(不強制)在類中定義id但用GORM時id無須自己聲明GORM會幫我們自動添加id和versionGORM通過反射機制獲得域類屬性信息決定數據庫字段類型所以在定義域類時不要使用def關鍵字來定義屬性務必明確定義屬性類型比如在下面的域類Article中用String來定義content(而不是def content)在默認情況下String映射到數據庫中的字段類型是VARCHAR(Date映射到數據庫中的字段類型是DATETIME)如果通過類變量contraints定義了String的長度范圍且長度過長映射到數據庫中的字段類型會變為TEXT十分智能
class Article {
Date dateAdded // Date 映射到數據庫中的字段類型是DATETIME
String content
static constraints = {
content(blank: false size: )
// 如果沒有定義content的大小范圍它在數據庫中類型為VARCHAR最大長度是
// 顯然不滿足我們的需求這樣定義後數據庫中的字段類型會變為TEXT
}
}
如果將數據源 /grailsapp/conf/XXXDataSource中的String dbCreate = updateGrails會自動幫我們同步內存和數據庫中域類對象的狀態這點是很方便的不需要在每次修改對象後update了(GORM中的save()相當於Hibernate中的saveOrUpdate())其好處猶如Java中new出一個對象當不再使用此對象時不需要自行delete一樣在實際開發中您就會體會到了
下面讓我們看一下GORM中的::NN:N:N以及繼承關系映射
一對一關系
class Dog {
String name
Tail tail // 狗有一條尾巴
}
class Tail {
float size
Dog owner // 尾巴也知道自己屬於那只狗
}
現在Dog和Tail的一對一關系是雙向的當然你也可以去掉Tail類中的owner屬性或Dog類中的tail屬性使一對一關系變為單向的
級聯刪除當Dog對象被刪除時則Dog對象所引用的Tail對象也將被相應刪除;同樣地當Tail對象被刪除時Tail對象所引用的Dog對象也將被相應刪除如果你認為Tail被切除後Dog應該還活著即Tail對象刪除後Tail對象所應用的Dog對象不應該被刪除那麼我們可以通過在Tail類中聲明類變量belongsTo來實現在這個場景中我們將Tail改為
class Tail {
float size
Dog owner // 尾巴也知道自己屬於那只狗
static belongsTo = Dog // 注意是static的
}
級聯更新/保存當Dog對象更新/保存Dog對象所引用的Trail對象也更新/保存;反之亦然
一對多多對一關系
class Dog {
String name
static hasMany = [feet: Foot] // 通過聲明類變量hasMany來定義Dog一這方有多Foot
}
class Foot {
float size
Dog owner
static belongsTo = Dog // 在一對多多對一關系中默認多方belongsTo一方
}
關於保存更新和刪除與一對一關系相同都是級聯更新/保存和級聯刪除當Dog被刪除時由於Foot belongsTo(屬於) Dog所以Dog對象所引用的所有Foot對象全被刪除;而當Foot對象被刪除時Dog對象不會被刪除這是通過類變量belongsTo實現的
多對多關系
class Teacher {
String name
static hasMany = [students: Student]
}
class Student {
String name
static hasMany = [teachers: Teacher]
static belongsTo = Teacher // 在多對多關系中至少有一方聲明類變量belongsTo
}
更新/保存在多對多關系中相對一對一一對多多對一關系中要特殊點就是只有擁有方可以級聯更新/保存比如在本例中由於Student belongsTo Teacher 所以Teacher是擁有方Teacher的更新/保存將引起Teacher對象所引用的所有Student對象的更新/保存
刪除也有點特殊擁有方被刪除後它所引用的對象不會被刪除你必須自己刪除它們否則它們將成為孤兒
繼承關系
class Base {}
class Derived extends Base {}
只要定義類無需任何配置夠簡單吧
用Grails開發就是這麼簡單快捷域類定義好了之後剩下的事情比如建表約束等Grails全幫您自動搞定很省心!Grails官方網站上有很多文檔供參考對GORM的進一步學習您可以看一下GORM
From:http://tw.wingwit.com/Article/program/Java/hx/201311/26540.html